迭代器&生成器

倾然丶 夕夏残阳落幕 提交于 2019-11-27 11:16:17

什么是列表生成式:用简洁的语句通过不同的规则动态的生成需要的列表。
[i * 2 for i in range(10)]
等同于:
l = []
for i in range(10):
l.append(i * 2)

在要生成大量数据的场景,使用列表生成器将占用大量的内存空间,此时可以通过使用生成器(generator)来边循环边计算,以节省内存资源。
生成器:只有在遍历时才生成对应的值,且只记录当前位置的值。
gen = ( i * 2 for i in range(10))

生成器的遍历:
1,使用for循环遍历: for i in gen
2,使用next()函数来获取生成器的下一个返回值:next(gen), gen.__ next__()

当生成器的推算算法比较复杂,使用类似列表生成式的for循环语句无法实现的时候,我们还可以使用函数来实现推算。

生成斐波拉契数列:
def fib(max):
n,a,b =0,0,1
while n < max:
yield b
a,b = b, a + b
n+=1
return "finished" # 生成器函数return内容为报错的时候显示的信息
# fib函数中使用了yield就变成了一个生成器。
fib(100)

yield的作用保存当前状态并返回。
next方法,只调用yield不传值, send方法给会唤醒yield并给yield传值。

迭代器:
可直接用于for循环的数据类型有集合数据类型(list,tuple,dict等)和生成器。这些能够直接作用于for循环的对象统称为可迭代对象(Iterable).
我们可以通过isinstance()判断对象是否是一个可迭代对象。
isinstance({},Iterable)
isinstance([],Iterable)
isinstance((x *2 for i in rnage(10)),Iterable)

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

我们可以通过isinstance()判断对象是否是一个Iterator对象:
from collections import Iterator
isinstance((x * 2 for i in range(10)),Iterator) # True
isinstance([],Iterator) # False

生成器都是迭代器对象,但List,dict,str等这些类型虽然是可迭代对象,却不是迭代器对象。
可以使用iter()函数,将list,dict,str等可迭代对象转换为迭代器对象:
isinstance(iter([]),Iterator)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!