欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Python学习之迭代器协议

发布时间:2025/3/15 27 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Python学习之迭代器协议 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 迭代(iteration)
    • 可迭代(iterable)
    • 迭代器(iterator)
    • 迭代器协议(iterator protocol)
    • 迭代器协议与 for 循环



迭代(iteration)

逐个获取元素的过程,就是「迭代」。

例如:

# iteration # 用 for 循环迭代序列 a_list = [1, 2, 3] for i in a_list:print(i)

可迭代(iterable)

实现了方法 __iter__ 的对象是可迭代的。

如果你暂时听不懂,那可以简单地理解为:如果我们可以从一个对象中逐个地获取元素,那么我们就说这个对象是「可迭代」的。

Python 中的顺序类型,都是可迭代的,例如 list、 tuple,、string;另外 dict、set、 file 也是可迭代的。

迭代器(iterator)

实现了方法 __next__ 的对象是迭代器。

当你调用方法 __next__ (可不提供任何参数)时,迭代器应返回下一个值。如果迭代器没有可供返回的值,应引发 StopIteration 异常。

你还可使用内置的便利函数 next,在这种情况下,next(it) 与 it.__next__() 等效。

迭代器协议(iterator protocol)

迭代器协议指的是容器类需要包含一个特殊方法,这个特殊方法就是 __iter__() 方法。

如果一个容器类提供了 __iter__() 方法,并且该方法能返回一个能够逐个访问容器内所有元素的迭代器,则我们说该容器类实现了迭代器协议。

迭代器协议与 for 循环

讲这个例子,是为了更好地理解迭代器协议。

# iterator protocol and for loop for x in something:print(x)

Python 处理 for 循环时,首先会调用 something.__iter__(),返回 something 对应的迭代器(假设叫 it);而后,for 循环会调用 it.__next__(),获取迭代器的下一个元素,并赋值给 x,然后执行循环体;执行完后,for 循环会继续调用 it.__next__(),获取迭代器的下一个元素,并赋值给 x,执行循环体 …… 当 for 循环调用 it.__next__()产生 StopIteration 异常时,循环结束。

咱们可以用下面的代码模拟一下:

>>> a_list = [1,2,3,4] >>> it = a_list.__iter__() # 获取迭代器 >>> it.__next__() # 让迭代器返回下一个值 1 >>> it.__next__() 2 >>> it.__next__() 3 >>> it.__next__() 4 >>> it.__next__() # 迭代器没有可供返回的值,引发 StopIteration 异常 Traceback (most recent call last):File "<stdin>", line 1, in <module> StopIteration >>>






参考资料

【1】《Python基础教程》(人民邮电出版社,第3版)

【2】 Python 中的黑暗角落(一):理解 yield 关键字

总结

以上是生活随笔为你收集整理的Python学习之迭代器协议的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。