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
。现在纠正它。