关键字`in`如何在迭代器中工作?

时间:2014-06-27 03:34:58

标签: 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

关键字in的工作方式如下:

3 in gen

等于:

j = 3
for i in gen:
    if i == j:
        return True
    else:
        return False

但在for循环之后,请勿再次将迭代器重置为第一个。

是吗?

3 个答案:

答案 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 and not 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 并不需要遍历整个(可能是无限的)迭代器。