【发布时间】:2017-03-08 09:29:57
【问题描述】:
我正在阅读有关生成器和迭代器以及 __next__() 的角色的信息。
'__next__' in dir(mygen)。是真的
'__next__' in dir(mylist),是假的
当我深入研究它时,
'__next__' in dir (mylist.__iter__()) 为真
-
为什么
__next__仅适用于列表,但仅适用于__iter__()和mygen而不是mylist。当我们使用 list-comprehension 遍历列表时,__iter__()如何调用__next__尝试手动提升 (+1) 生成器,我打电话给
mygen.__next__()。它不存在。它只作为mygen.__next__存在,称为method-wrapper。 什么是方法包装器,它有什么作用?这里是如何应用的:在
mygen() and __iter__() ?-
如果
__next__是生成器和迭代器都提供的(以及它们唯一的属性),那么生成器和迭代器有什么区别?*答案 3:已解决,如 mod/editor 所述:
更新:生成器和迭代器都有__next__()。我的错。查看日志,不知何故 mygen.__next__() 测试给了我停止迭代异常错误。但我无法再次复制该错误。
感谢大家的回答!
【问题讨论】:
-
"尝试手动升级 (+1) 生成器,我打电话给
mygen.__next__()。它不存在。" - 是的。如果看起来没有,那你就搞砸了。 -
你是对的。
a=[1,2,3,4].__iter__() a.__next__()产生了Out[1] 1显然正在加紧。但是另一个mygen.__next__()失败了:StopIteration <snip> ---> 14 mygen.__next__() StopIteration:我也忽略了这个错误,并认为它丢失了。但事实并非如此。这只是 stopIteration 错误。我仍然不明白为什么当__next__()还没有被调用过时它会抛出停止迭代异常。 -
好吧,
mygen.__next__()现在可以工作了。它早些时候给了我stopiteration exception。我无法复制它。感谢您的提示。 -
@theMobDog
__next__将在迭代器结束时抛出 StopIteration 异常。如果要再次迭代对象,则需要创建一个新的迭代器。
标签: python python-3.x iterator generator wrapper