python - 为什么 iter 不是实例的方法而 __iter__ 是?

标签 python iterator python-internals

<分区>

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

为什么 Python 的人选择将它作为像 len() 这样的通用函数(结果是 iter(list) 而不是 list.iter ())?

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

最佳答案

iter() 支持不同类型的对象

您可以传入序列(支持长度和项目访问)或可迭代对象(通过调用 obj.__iter__() 生成迭代器)或迭代器(返回 self 来自 __iter__)。

Java list.iter() 然后由 Python 中的 list.__iter__() 服务,但是 iter() 函数允许更多类型。您可以使用 __iter__ 方法自定义行为,但如果您改为实现序列,事情仍然有效

还有第二种形式的函数,其中传入了一个可调用对象和一个标记:

iter(fileobj.readline, '')

通过调用 readline() 方法遍历文件对象,直到它返回一个空字符串(等于第二个参数,哨兵)。

然后是Principle of Least Astonishment争论; iter() 为标准库提供了一个稳定的 API 调用来标准化,就像运算符一样;无需查找类的文档来查看它是否实现了 obj.iter()obj.iterator()obj.get_iterator().

关于python - 为什么 iter 不是实例的方法而 __iter__ 是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25201717/

相关文章:

Python XML Feed 解析器无法找到特定事件

python - 将迭代器转换为列表的最快方法

python - 使用迭代器实现 Chop()

python - Python 的交互模式是如何工作的?

python - Python gc.get_count() 返回的 count0、count1 和 count2 值是什么

python - 将输入(密码)转换为 MD5

python - 如何在一个 NumPy 数组中搜索位置,以便在这些位置获取第二个 NumPy 数组中的值?

c++ - 如何使用两个函数,一个返回迭代器,另一个返回 const_iterator

python - 如何可靠地将数字的小数部分和浮点部分分开?

python - SqlAlchemy( flask +Postgres) : How to update only a specific attribute of a json field?