python-迭代器

可以直接作用于for循环的数据类型有以下几种:

1、集合数据类型: list、tuple、dict、set、str等

2、generator,包括生成器和带yield的函数

这些可以直接作用域for循环的对象统称为可迭代的对象: Iterable

可以通过isinstance()来判断一个对象是否为Iterable对象:

from collections import Iterable

print(isinstance([],Iterable))

print(isinstance('abc',Iterable))

print(isinstance((),Iterable))

print(isinstance({},Iterable))

print(isinstance((x for x in range(10)),Iterable))

print(isinstance(1000,Iterable))

 执行结果:

True
True
True
True
True
False

生成器不但可以作用于 for循环,而且可以通过next()函数不断调用并返回下一个值,直到抛出StopIteration错误,表示无法继续返回下一个值

可以被next()函数调用并不断返回下一个值的对象称为迭代器: Iterator

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

from collections import Iterator

print(isinstance([],Iterator))

print(isinstance('abc',Iterator))

print(isinstance((),Iterator))

print(isinstance({},Iterator))

print(isinstance((x for x in range(10)),Iterator))

print(isinstance(100,Iterator))

 执行结果:

False
False
False
False
True
False

可以看出,虽然list、dict、str是Iterable,却不是Iterator

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到StopIteration错误被抛出。可以把这个数据流堪称是一个有序序列,但是,却无法提前预知该序列的长度,只能通过不断调用next()函数去获取下一个数据。

所以,Iterator的计算是惰性的(惰性计算),只要在需要的时候,才会去计算并返回下一个值。

我们可以通过iter()函数将上面的Iterable转换为Iterator

print(isinstance(iter([]),Iterator))

print(isinstance(iter('abc'),Iterator))

print(isinstance(iter(()),Iterator))

print(isinstance(iter({}),Iterator))

 执行结果:

True
True
True
True

猜你喜欢

转载自funny121.iteye.com/blog/2356021