in
运算符是一个成员运算符,用于测试序列中的成员资格。
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
运算符?
答案 0 :(得分:5)
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
第二种实际上更经常使用。根据{{3}},它枚举可迭代对象的元素,以便可以对它们执行操作。
您可以遍历列表:
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
实现iteration protocol方法的任何对象,只要后者返回实现__iter__
方法的对象。
以下示例是一个基本的(不是说"差的")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
许多原生类型都是可迭代的:__next__
,dictionaries,ranges ......
从语义上讲,对两个上下文使用相同的in
字是有意义的。 "这件东西是什么东西?"是一个有效的问题,只要" stuff"是一个集合,它能够包含东西。从此以后,"为那些东西中的每一件事做到这一点"看起来很自然。
因此使用""对于这两种情况。
然而,这实际上是对现实的简化,实际上更为广阔。我邀请您阅读sets,要深入了解in
关键字,请阅读documentation。
答案 1 :(得分:0)
具有__contains __()方法的任何对象都可以使用“in”运算符。通过使用dir()函数或hasattr()函数,您可以检查是否可以在该对象上使用“in”运算符
>>>dir(hw)
[...,__contains__,...]
>>>hasattr(hw,"__contains__")
True
答案 2 :(得分:0)
你需要考虑的主要事情是关键字in
如果你在for
循环中使用它,那么它将重新定义char或循环中的每一行。
所以要在你需要的循环中单独测试每个角色:
s = 'HELLO'
char = 'M'
for chr in s:
if char in chr:
print chr
但这有点毫无意义。您也可以使用if char=chr
但你可以像这样测试列表元素中的字符:
s = ['HELLO', 'MIKE', 'BOB']
char = 'M'
for word in s:
if char in word:
print word
将测试每个列表元素是否存在“M”