Python __iter__ 和迭代器(iterator)

1.Python 序列可以迭代的原因

序列可以迭代,原因是解释器需要迭代对象时,会自动调用内置函数 iter(obj) ,此方法在需要为容器创建迭代器时被调用,返回一个新的迭代器对象。产生的迭代器能逐个迭代容器中的所有对象。

iter(object[, sentinel])

返回一个 iterator/迭代器 对象。

object 必须是支持迭代协议(有 __iter__() 方法)的集合对象,或必须支持序列协议(有 __getitem__() 方法,且数字参数从 0 开始)。如果它不支持这些协议,会触发 TypeError

在《流畅的Python》这样描述 iter函数的执行过程:

检查对象是否实现了 __iter__ 方法, 如果实现了就调用它, 获取一个迭代器;

如果没有实现 __iter__ 方法, 但是实现了 __getitem__ 方法,Python 会创建一个迭代器, 尝试按顺序(从索引 0 开始) 获取元素;

如果尝试失败, Python 抛出 TypeError 异常, 通常会提示“xx objectis not iterable”

3.迭代器类型

#1 容器对象的迭代

容器对象要提供迭代支持,必须定义一个方法: container.__iter__(),返回一个迭代器对象。 该对象需要支持迭代器协议。

如果容器支持不同的迭代类型,则可以提供额外的方法来专门地请求不同迭代类型的迭代器。 (支持多种迭代形式的对象的例子有同时支持广度优先和深度优先遍历的树结构。) 此方法对应于 Python/C API 中 Python 对象类型结构体的 tp_iter 槽位。

#2 迭代器协议

迭代器对象自身需要支持以下两个方法,它们共同组成了 迭代器协议

iterator.__iter__()

返回迭代器对象本身。 这是同时允许容器和迭代器配合 for 和 in 语句使用所必须的。 此方法对应于 Python/C API 中 Python 对象类型结构体的 tp_iter 槽位。

iterator.__next__()

从容器中返回下一项。 如果已经没有项可返回,则会引发 StopIteration 异常。 此方法对应于 Python/C API 中 Python 对象类型结构体的 tp_iternext 槽位。

https://docs.python.org/zh-cn/3/search.html?q=__iter__&check_keywords=yes&area=default

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值