python - 关于python中的迭代器的困惑
问题描述
我对python中的迭代器感到困惑。请看一下代码。
class MyNumbers:
def __init__(self):
self.a=4
def __iter__(self):
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter1 = iter(myclass)
c=list(myiter1)
for x in myiter1:
print(x)
我没有从上面的代码中得到任何输出。我期待从 4 开始进行一些值迭代。但是当我删除时,c=list(myiter1)
我得到了预期的输出。所以我对此感到困惑。为什么会这样。
解决方案
您的迭代器已用尽:list
在分配中c
消耗了所有可用值,从而产生一个列表和一个迭代器,当您再次尝试对其进行迭代时,该列表[4, 5, 6, ..., 20]
和迭代器将立即引发。StopIteration
您可能会感到困惑,因为您似乎可以多次迭代列表。但那是因为列表本身不是迭代器。
>>> list.__next__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'list' has no attribute '__next__'
调用iter
列表会产生一个list_iterator
值,而不是列表本身。该迭代器与任何其他迭代器一样是可耗尽的。
>>> x = [1,2,3]
>>> y = iter(x)
>>> type(y)
<class 'list_iterator'>
>>> list(y)
[1, 2, 3]
>>> list(y)
[]
for
循环隐式调用iter
您尝试迭代的事物。按照惯例,所有迭代器也是可迭代的:迭代器__iter__
应该返回self
。
推荐阅读
- node.js - 无法使用 bcrypt 登录用户(dyld:找不到符号)
- node.js - 如何在基于 NPM 的浏览器项目中使用 Faker.js?
- microservices - 微服务 - 事件存储技术(在事件源解决方案中)是否在所有微服务之间共享?
- php - 如何修复 add_action?
- ruby - 将 Gem 部署到 geminabox 服务器的 Rake 发布任务挂起
- android - Android - 每次我尝试打开它时应用程序崩溃
- jquery - Ajax - 如何检查 CSS 类的返回 HTML?
- java - 二进制搜索具有不同字长的文件
- android - AndroidX 迁移后找不到符号 DataBindingComponent
- docker - docker-ee-selinux 与 2:container-selinux-2.21-1.el7.noarch 冲突