2

我有这个:

>>> 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循环之后,不要再次将迭代器重置为第一个。

那正确吗?

4

3 回答 3

5

生成器在产生值时维护上下文。所以,当你这样做

1 in gen

它将开始迭代,当它到达时1,它会返回True,但当前状态是 at 1。接下来,当你这样做时3 in gen,它会迭代 until3并 yield 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

于 2014-06-27T03:40:16.213 回答
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的成功调用不需要循环整个(可能是无限的)迭代器。

于 2014-06-27T04:12:23.763 回答
0

来自 Python 数据模型的文档:

成员资格测试运算符 (innot in) 通常实现为通过序列的迭代。

它开始遍历迭代器,直到它到达项目,然后返回True,或者耗尽迭代器并返回False。如果迭代器没有用完,您仍然可以从中获取剩余的项目,但这不会重新启动生成器,您只会遍历剩余的元素。

于 2014-06-27T03:47:40.423 回答