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

kkk*_*kv_ 2 python iterator in-operator

我有这个:

>>> 1 in (i for i in range(0, 5))
True

>>> 2 in (i for i in range(0, 5))
True
Run Code Online (Sandbox Code Playgroud)

之后:

>>> gen = (i for i in range(0, 5))
>>> 1 in gen
True
>>> 3 in gen
True
>>> 2 in gen
False
Run Code Online (Sandbox Code Playgroud)

关键字是否in有效:

3 in gen
Run Code Online (Sandbox Code Playgroud)

等于:

j = 3
for i in gen:
    if i == j:
        return True
    else:
        return False
Run Code Online (Sandbox Code Playgroud)

但在for循环之后,请勿再次将迭代器重置为FIRST.

是对的吗?

the*_*eye 5

生成器在产生值时保持上下文.所以,当你这样做的时候

1 in gen
Run Code Online (Sandbox Code Playgroud)

它将开始迭代,当它到达时1,它返回True,但当前状态为1.接下来,当你这样做时3 in gen,它会迭代直到3并产生True.然后当你这样做

2 in gen
Run Code Online (Sandbox Code Playgroud)

它开始迭代3,而不是从头开始.这就是你得到的原因False.

在你的程序中,

j = 3
for i in gen:
    if i == j:
        return True
    else:
        return False
Run Code Online (Sandbox Code Playgroud)

如果i不相等j,它会立即返回False.相反,它可以被宽泛地理解为,

return any(i == j for j in gen)
Run Code Online (Sandbox Code Playgroud)

any迭代生成器,直到任何项符合条件.如果没有任何项目匹配,它将耗尽发电机并将返回False.