迭代器的成员资格测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器的成员资格测试相关的知识,希望对你有一定的参考价值。

有人可以在我的代码的最后3行中向我解释成员资格测试的行为,为什么它是假的?为什么迭代器和迭代器的成员资格测试不同?

c = [1,2,3,4,5,6,7,8,9,10,11,12]

print(3 in c)   # True
print(3 in c)   # True

d = iter(c)
print(2 in d)   # True
print(4 in d)   # True
print(4 in d)   # False  ???
print(6 in d)   # False  ???
print(10 in d)   # False  ???
答案

迭代器在使用时会被消耗掉。我会解释你的例子:

>>> c = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> d = iter(c)
>>> print(list(d))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> print(list(d))
[]

您可以将迭代器d视为指向列表中第一项的指针。读取其值后,它指向第二个项目。当它到达结尾时,它指向一个空列表。

另见:

>>> c = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> d = iter(c)
>>> print(next(d))
1
>>> print(next(d))
2
>>> print(list(d))
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

检查是否有内容也消耗其内容:

>>> c = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> d = iter(c)
>>> 4 in d
True
>>> print(list(d))
[5, 6, 7, 8, 9, 10, 11, 12]
另一答案

因为迭代器有一个状态 - 在你的情况下是一个指向当前元素的指针。

两次连续检查之间的区别

print(4 in d)   # True
print(4 in d)   # False  ???

是迭代器的状态。首先检查迭代器的指针在4之后设置为下一个元素。

以上是关于迭代器的成员资格测试的主要内容,如果未能解决你的问题,请参考以下文章

测试 Scala 类型类中的成员资格

结合多个成员资格测试[重复]

迭代器的注意事项

python 中的成员资格测试比 set() 更快

熊猫数据框列中的成员资格测试

3.4 迭代器