为通常使用Java,C ++等编程的人获取迭代器的“直观”方法类似于list.iterator()
。
为什么Python人员选择将其作为len()
之类的通用函数(导致iter(list)
而不是list.iter()
)?
同样的问题也可以询问构造的长度(len()
)。
答案 0 :(得分:4)
iter()
支持不同类型的对象。
您可以传入一个序列(支持长度和项访问权限)或一个iterable(通过调用obj.__iter__()
生成一个迭代器)或一个迭代器(从self
返回__iter__
)。
然后,Java list.iter()
由list.__iter__()
提供,但iter()
函数允许更多类型。您可以使用__iter__
方法自定义行为,但如果您实现了序列,事情仍然可以正常工作。
还有第二种形式的函数,其中传递了一个callable和一个sentinel:
iter(fileobj.readline, '')
通过调用readline()
方法迭代文件对象,直到它返回一个空字符串(等于第二个参数,即sentinel)。
然后是Principle of Least Astonishment参数; iter()
为标准库提供了一个稳定的API调用来标准化,就像运算符一样;无需查看该类的文档,看它是否实现了obj.iter()
或obj.iterator()
或obj.get_iterator()
。