迭代器 Iterator
先介绍一个概念:Iterable(可迭代对象)
。可以直接作用于for
循环的对象。
像集合数据类型(list,tuple,dict,set,str
等) 和generator
(包括生成器和带yield
的generator function)都是可迭代对象。
那么,什么是 Iterator
呢?它和 Iterable
又有什么区别?
Iterator(迭代器) 是可以被next()
函数调用并不断返回下一个值的对象。
它表示的是一个数据流。我们可以将它看成一个有序序列,但是不能提前知道序列的长度(因为要被next()调用实现计算下一个数据,直到没有数据时抛出StopIteration
错误。)这里也可以看出,Iterator的计算是惰性的,因为只有在需要返回下一个数据时,它才会计算。
Iterator 可以表示一个无限大的数据流,比如全体自然数。这是list做不到滴。
下面就来看看如何使用迭代器。
之前已经学习了判断可迭代对象的方法,再回顾一下:
>>> from collections import Iterable
>>> isinstance('abc', Iterable)
True
判断是否为迭代器的方法类似:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)),Iterator)
True
>>>isinstance('abc',Iterator) //str不是迭代器,因为不能用next()调用并返回下一个值。
False
如果要将 Iterable
变成 Iterator
,可以用iter()
函数:
>>> isinstance(iter('abc'),Iterator)
True
⚠️注意:
Python的for循环,本质上是通过不断调用next()函数实现的。
举个例子:
>>> for x in[1,2,3,4]: print(x)
1
2
3
4
实际上完全等价于:
>>> it =iter([1,2,3,4])
>>> while True:
try:
x = next(it)
except StopIteration:
break
7.20 学习打卡