Python三器一闭
1、迭代器
什么是迭代?
迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
什么是可迭代对象?
Python中的可迭代对象并不是指某一种具体的数据类型,是指存储了若干个元的容器,且这这个容器中的元素可以通过__iter()__
和 __getitem__()
访问。
常用的可迭代对象有:list
、tuple
,dict
,str
,set
、生成器和带有yield
的生成器函数。
判断一个对象是否是可迭代对象:
1 | from collections.abc import Iterable |
获取可迭代对象的迭代器
1 | item = range(10) |
iter()
内部做了什么?
- 检查对象内部是否实现了
__iter__()
如果实现了, 则调用它,获取一个迭代器。 - 如果没有实现
__iter__()
方法,但是 实现了__getitem__()
,python内部会实现一个迭代器。 - 如果 以上都失败,则会抛出异常:说明对象不可迭代。
for x in range(10): print(x)
循环执行了什么?
获取可迭代对象的迭代器, 然后在调用next()
方法获取下一个元素。
1 | item = range(10) |
for 循环即先获取可迭代对象的迭代器,然后在调用next()
方法,且在超过迭代对象的长度时,自动捕获错误:StopIteration
。
1 | for x in range(10): |
如何自定义可迭代对象?
如上文那样,在一个对象中实现这个__iter__()
方法。
1 | class MyList: |
1 | class MyList: |
以上类MyList的对象 实现了__iter__()
, 所以他是一个可迭代对象,且 print(isinstance(my_list, Iterable))
判断为True。但是 print(isinstance(my_list, Iterator))
为False
如何实现一个迭代器呢?
如下面代码所示在可迭代对象中再实现__next__()
方法 即可让改对象成为一个迭代器。
1 | class MyList: |
综上所述:
对一个可迭代对象调用iter()
方法,其实内部就是寻找__iter__()
,并调用,返回的对象当做迭代器。
对一个迭代器对象调用next()
方法,其实内部就是寻找__next__()
,并调用,返回可迭代对象的下一个元素。
所以一个迭代器一定是个可迭代对象,但是可迭代对象并不一定是个迭代器。
2、生成器
什么是生成器?
在python 中通俗的理解:一边循环一边计算的机制成为生成器,生成器是一种特殊的迭代器。