什么是列表生成式:用简洁的语句通过不同的规则动态的生成需要的列表。
[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)
原文:https://www.cnblogs.com/heyong45/p/11361389.html