对于通常用Java、c++等编程的人来说,获得迭代器的"直观"方式是list.iterator()
。
为什么Python的人选择把它作为一个通用函数,像len()
(这导致iter(list)
而不是list.iter()
)?
同样的问题也可以用于构造体的长度(len()
)。
iter()
支持不同类型的对象
可以传入序列(支持长度和项访问)或可迭代对象(通过调用obj.__iter__()
产生迭代器)或迭代器(从__iter__
返回self
)。
Java list.iter()
然后由Python中的list.__iter__()
提供,但是iter()
函数允许更多类型。你可以用__iter__
方法自定义行为,但如果你实现了一个序列,的东西仍然会工作。
还有第二种形式的函数,其中传入一个可调用对象和一个哨兵:
iter(fileobj.readline, '')
通过调用readline()
方法迭代一个文件对象,直到它返回一个空字符串(等于第二个参数,哨兵)。
则有最小惊奇原则论证;iter()
为标准库提供了一个稳定的API调用来进行标准化,就像操作符一样;不需要查找类的文档来查看它是否实现了obj.iter()
或obj.iterator()
或obj.get_iterator()
。