in
Python中的运算符是一个成员运算符,用于测试序列中的成员资格.
in
运营商的描述
如果在指定序列中找到变量,则求值为true,否则求值为false.
现在考虑代码:
>>>s = 'HELLO' >>>char = 'M' >>>char in s False >>>for char in s: .... print(char) H E L L O
请在这里纠正我:我想声明for char in s
应该检查'M'
在'HELLO'
其中进行评估,False
并循环应该结束.但是在这里,它不是检查成员资格,而是将每个字符分配给变量char
,因此循环打印每个字符.我的问题是,in
除了检查会员资格外,如何使用运营商?
该in
关键字用于两种不同的上下文:
会员资格考试
迭代
如你所说,第一个通过调用序列来检查某些东西是否属于一个序列__contains__
.使用此语法时,将返回布尔值.
x = 1 l = [0, 1, 2] if x in l: print("x is in l") else: print("x is not in l")
> x is in l
由于in
查找__contains__
方法,x in seq
只要seq
实现一个__contains__
方法就有效.关于成员资格的概念,您可以实现这一点,即使它没有逻辑意义.
class Foo: def __contains__(self, x): return x == 12 f = Foo() if 12 in f: print("12 is in f")
> 12 is in f
第二个实际上更经常使用.根据迭代协议,它枚举可迭代对象的元素,以便可以对它们执行操作.
您可以迭代列表:
l = [0, 1, 2] for x in l: print(x)
> 0 > 1 > 2
在一个字符串:
s = "hello" for c in s: print(c)
> h > e > l > l > o
并且在实现该__iter__
方法的任何对象上,只要后者返回实现该__next__
方法的对象.
以下示例是一个基本的(不是说"差")range
类,您可以迭代实例.
class Bar: def __init__(self, first, last): self.first = first self.last = last self.current = first def __iter__(self): return self def __next__(self): if self.current == self.last: raise StopIteration result = self.current self.current += 1 return result b = Bar(0, 5) for i in b: print(i)
> 0 > 1 > 2 > 3 > 4
许多本机类型都是可迭代的:字典,范围,集合 ......
从语义上讲,in
在两种情境中使用相同的单词是有意义的."那东西是这个东西吗?" 是一个有效的问题,只要"stuff"是一个集合,它能够包含东西.从此以后,"为那东西中的每一件事做这件事"似乎很自然.
因此,对于两种情境都使用"in".
然而,这实际上是对现实的简化,实际上更为广阔.我邀请您阅读文档,并深入了解该in
关键字,阅读Python的语法.