[英]How does keyword`in` works in iterator?
我有这个:
>>> 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循环之后,请勿再次将迭代器重置为FIRST。
那正确吗?
生成器在产生值时会维护上下文。 所以,当你这样做
1 in gen
它会开始迭代,并在达到1
时返回True
,但当前状态为1
。 接下来,当您3 in gen
执行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
。
成员资格测试运算符(
in
和not in
)通常实现为序列的迭代。
它开始遍历迭代器,直到到达该项目为止,然后返回True
,或者用尽迭代器并返回False
。 如果迭代器没有用尽,您仍然可以从中获取剩余的项,但是这不会重新启动生成器,并且您将仅迭代剩余的元素。
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的成功调用不必遍历整个(可能是无限的)迭代器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.