python——迭代器与可迭代对象
一、可迭代对象
1. 可以直接作用于 for 循环的对象统称为可迭代对象:Iterable
2. 可直接作用于 for 循环的对象:
一类是集合数据类型:list、tuple、dict、set、str等
一类是 generator,包括生成器和带 yield 的 generator function
3. 可以通过 isinstance()函数,判断是否为可迭代对象 Iterable
>>> from collections.abc import Iterable
>>> isinstance([],Iterable)#判断list
True
>>> isinstance({},Iterable)#判断dict
True
>>> isinstance('abc',Iterable)#判断str
True
>>> isinstance((x for x in range(10)),Iterable)#判断generator
True
>>> isinstance(100,Iterable)#判断数字
False
>>> isinstance((),Iterable)
True
二、迭代器
1. 可以被 next()函数调用,并且不断返回下一个函数值的对象称为迭代器:Iterator
2. 生成器 generator 都是迭代器,但是 list、tuple、dict、set、str等不是迭代器
3. 可以通过 isinstance()函数判断一个对象是否为 Iterator 对象
>>> from collections.abc import Iterator
>>> isinstance([],Iterator)#判断list
False
>>> isinstance((),Iterator)#判断tuple
False
>>> isinstance((x for x in range(10)),Iterator)#判断generator
True
>>> isinstance('abc',Iterator)#判断str
False
4. 把list、tuple、dict、set、str等可迭代对象Iterable变成Iterator,可以用 iter()函数
>>> isinstance(iter([]),Iterator)
True
>>> isinstance(iter({}),Iterator)
True
Iterable可以通过 iter()函数得到一个 Iterator对象
5. Python的 Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出 StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
6. python中 for循环的本质是通过不断调用 next()函数实现的