回答
要使类可迭代,请编写一个返回迭代器的方法__iter__()
。例如
class MyList(object):
def __init__(self):
self.list = [42, 3.1415, "Hello World!"]
def __iter__(self):
return iter(self.list)
m = MyList()
for x in m:
print x
打印
42
3.1415
Hello World!
的例子使用的列表迭代器,但你也可以通过任一使__iter__()
一个generator或通过返回定义next()
一个迭代器类的实例编写自己的迭代器方法。
这question可以帮助你,它描述了如何使一个迭代符
的Python documentation精确地描述了这一点:
一种方法需要对容器对象被定义为提供迭代支持:
container.__iter__()
Return it iter ator对象。该对象需要支持下面描述的迭代器协议。如果一个容器支持不同类型的迭代,可以提供额外的方法来专门为这些迭代类型请求迭代器。 (支持多种迭代形式的对象的一个例子是支持广度优先和深度优先遍历的树结构。)此方法对应于Python/C API中Python对象的类型结构的tp_iter槽。
迭代器对象本身都必须支持下面的两种方法,它们一起形成所述迭代器协议:
iterator.__iter__()
返回迭代器对象本身。这是允许容器和迭代器与for和in语句一起使用所必需的。此方法对应于Python/C API中Python对象的类型结构的tp_iter插槽。
iterator.next()
返回从容器中的一个项目。如果没有其他项目,请引发StopIteration异常。此方法对应于Python/C API中Python对象类型结构的tp_iternext插槽。
你会想next()
和__iter__()
方法。 Here's a nice little tutorial。
该教程仅适用于Python 2.对于记录,发布此答案时存在Python 3。这里是Python 3的[一](http://nvie.com/posts/iterators-vs-generators/)。 – 2017-04-18 17:28:36
带有__iter__()
方法的任何对象都被认为是可迭代的。
此外,任何序列(具有__getitem__()
方法的对象)都可以返回迭代器。迭代器是一个带有__next__()
方法的对象,该方法返回序列中的下一个对象并引发StopIteration异常。
- 1. 据称“可迭代”的东西不是
- 2. HTML代码 - 某些东西是无效的 - 无法理解什么
- 3. Java迭代器的东西
- 4. jQuery如果元素包含某些东西,做些什么
- 5. 什么是适合REST的方式来“喜欢”Rails 3中的某些东西?
- 6. 在CUP中:如何使某些东西可选来解析?
- 7. 用迭代的东西代替函数
- 8. 在某个组件中存储某些东西是否安全?
- 9. 这是什么东西叫?
- 10. 从列表中删除某些东西
- 11. 什么是取代(/ \ n /克, “东西”)是什么意思?
- 12. 是否可以在iframe之前放置某些东西?
- 13. 什么是WPF中的x:东西?
- 14. JavaScript中的这个东西是什么?
- 15. 即使输入了某些东西,TextBox.text的值也是空的
- 16. 什么是!!和Ruby中的其他一些东西?
- 17. 什么是C:\ WINDOWS \ ASSEMBLY \目录中的那些东西?
- 18. 为什么在我运行代码时会安装某些东西?
- 19. 为什么这个迭代没有返回任何东西?
- 20. Python映像库在PyPI上不可用,还是我错过了某些东西?
- 21. 你如何在Python中调用某些东西?
- 22. 为什么Python语句'如果东西是None'比'如果不是东西'要快得多?
- 23. 通过字典的迭代和做一些东西
- 24. Mysql在某些日期后得到的东西
- 25. Python。迭代字典从某些关键
- 26. 什么是Perl模式的python等价物来追踪是否已经看到了某些东西?
- 27. 为什么有时候我的irb历史中会缺少某些东西?
- 28. 某些东西击落了java脚本
- 29. debian cron bug或缺少某些东西?
- 30. PHP包含,但只有某些东西
还有'__getitem__'的另一种方法,请参阅http://stackoverflow.com/a/9884259/284795 – 2015-07-12 13:10:45
@ColonelPanic是正确的,如果您定义'__getitem__',该类也是可迭代的。但是它会忽略你也定义了'__len__'并且只是无限地迭代。 – jlh 2017-10-24 20:52:20