我有这个:
>>> 1 in (i for i in range(0, 5))
True
>>> 2 in (i for i in range(0, 5))
True
之后:
>>> gen = (i for i in range(0, 5))
>>> 1 in gen
True
>>> 3 in gen
True
>>> 2 in gen
False
关键字in
的工作方式如下:
3 in gen
等于:
j = 3
for i in gen:
if i == j:
return True
else:
return False
但在for循环之后,请勿再次将迭代器重置为第一个。
是吗?
答案 0 :(得分:5)
生成器在产生值时维护上下文。所以,当你做的时候
1 in gen
它将开始迭代,当它到达1
时,它会返回True
,但当前状态为1
。接下来,当您执行3 in gen
时,它会迭代到3
并产生True
。然后当你做
2 in gen
它从3
开始迭代,而不是从头开始。这就是你得到False
的原因。
在你的程序中,
j = 3
for i in gen:
if i == j:
return True
else:
return False
如果i
不等于j
,则会立即返回False
。相反,它可以被宽泛地理解为,
return any(i == j for j in gen)
any
迭代生成器,直到任何项符合条件。如果没有任何项匹配,它将耗尽生成器并返回False
。
答案 1 :(得分:0)
From the docs on the Python data model:
通常会实施成员资格测试运营商(
in
andnot in
) 作为序列的迭代。
它开始迭代遍历迭代器,直到它到达项目,并返回True
,或耗尽迭代器并返回False
。如果迭代器没有用尽,你仍然可以从中获取剩余的项目,但这不会重新启动生成器,并且你只会遍历其余的元素。
答案 2 :(得分:0)
in 运算符的工作方式与下面定义的 f_in 函数类似:
def f_in(aj, gen):
j = aj
while(True):
try:
if(j == gen.next()):
return True
except StopIteration:
return False
mygen = xrange(5)
agen = iter(mygen)
print f_in(1, agen)
print f_in(3, agen)
print f_in(2, agen)
这很有意义,因为迭代器可能是无限的,并且成功调用其中的 3 并不需要遍历整个(可能是无限的)迭代器。