为什么它不是实例的方法而__iter__是?

时间:2014-08-08 10:45:35

标签: python iterator python-internals

为通常使用Java,C ++等编程的人获取迭代器的“直观”方法类似于list.iterator()

为什么Python人员选择将其作为len()之类的通用函数(导致iter(list)而不是list.iter())?

同样的问题也可以询问构造的长度(len())。

1 个答案:

答案 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()