繁体   English   中英

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

[英]How does keyword`in` works in iterator?

我有这个:

>>> 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循环之后,请勿再次将迭代器重置为FIRST。

那正确吗?

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

1 in gen

它会开始迭代,并在达到1时返回True ,但当前状态为1 接下来,当您3 in gen执行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

从有关Python数据模型的文档中:

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

它开始遍历迭代器,直到到达该项目为止,然后返回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的成功调用不必遍历整个(可能是无限的)迭代器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM