Python 关键字'in'在迭代器中如何工作?
我有这个:Python 关键字'in'在迭代器中如何工作?,python,iterator,in-operator,Python,Iterator,In Operator,我有这个: >>> 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 中的关键字是否类似于: 3 i
>>> 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
中的关键字是否类似于:
3 in gen
等于:
j = 3
for i in gen:
if i == j:
return True
else:
return False
但在for循环之后,不要再次将迭代器重置为第一个
是这样吗?生成器在生成值时会维护上下文。所以,当你这么做的时候
1 in gen
2 in gen
它将开始迭代,当到达1
时,返回True
,但当前状态为1
。接下来,当您在gen
中执行3时,它将迭代到3
,并生成True
。当你这样做的时候
1 in gen
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
成员资格测试操作符()通常是实现的
作为一个序列的迭代
它开始在迭代器中迭代,直到到达该项,然后返回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类调用不需要在整个(可能是无限的)迭代器上循环 当我在Python2.7和Python3中运行您的第二个示例时,我得到一个NameError:Name'I'没有定义。你确定你没有在解释器会话之前的某个地方定义i吗?@happy有我的错,我以前确实看到过这个结果,但是刚才,我测试了代码,我得到了你的结果。也许我在那个测试中写了I
。现在纠正它。