随笔 - 214  文章 - 12  评论 - 40  阅读 - 38万

Python进阶09 迭代器

一、迭代器

我们已经知道,集合数据类型(如list、tuple、dict、set、str等)和generator都可以直接作用于for循环。这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

1、可以使用isinstance()判断一个对象是否是Iterable对象:

复制代码
>>> from collections.abc import Iterable
>>> isinstance([1, 2, 3], Iterable)
True
>>> isinstance({1, 2, 3}, Iterable)
True
>>> isinstance('ABC', Iterable)
True
>>> isinstance((x for x in range(5)), Iterable)
True
>>> isinstance(100, Iterable)
False
复制代码

2、可以使用isinstance()判断一个对象是否是Iterator对象:

复制代码
>>> from collections.abc import Iterator
>>> isinstance((x for x in range(5)), Iterator)
True
>>> isinstance([1, 2, 3], Iterator)
False
>>> isinstance({1, 2, 3}, Iterator)
False
>>> isinstance('ABC', Iterator)
False
复制代码

 

Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

二、iter()函数

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:

>>> isinstance(iter([1, 2, 3]), Iterator)
True
>>> isinstance(iter('ABC'), Iterator)
True
>>> isinstance(iter({1, 2, 3}), Iterator)
True

三、迭代器协议

实现了方法__iter__的对象是可迭代的,而实现了方法__next__的对象是迭代器。

复制代码
class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b
        return self.a

    def __iter__(self):
        return self
复制代码
复制代码
fibs = Fibs()

for f in fibs:
    print(f)
    if f > 10:
        break

结果:
1
1
2
3
5
8
13
复制代码

四、从迭代器创建序列

除了对迭代器和可迭代对象进行迭代之外,还可将它们转换为序列。

一个这样的例子是使用构造函数list显示地将迭代器转换为列表。

复制代码
class TestIterator:
    value = 0

    def __next__(self):
        self.value += 1
        if self.value > 10:
            raise StopIteration

        return self.value

    def __iter__(self):
        return self

ti = TestIterator()
print(list(ti))

结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
复制代码

 

参考文章:

https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640

posted on   麦克煎蛋  阅读(209)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示