生成器是一种可迭代的类型,如列表或元组。(都可以使用for 循环来获取其中的每一个元素)
与列表不同的是,他们不允许使用任意索引,但是他们仍然可以通过for循环迭代。
可以使用函数和yield 语句来创建他们。
例如:
def countdown():
i=5
while i >0:
yield i #注意 遇到yield 阻塞 每次调用遇到yield都阻塞(目的是不让他一次性执行完 需要
# 使用在执行) 最终结果返回的是生成器
i-=1 #遇到 return 返回的是函数的结果 遇到return函数结束
for i in countdown():
print(i)
由于他们一次产生一个项目,所有生成器不具有列表的内存限制。事实上他们可以是无限的。
(创建生成器的目的就是他们省内存,在做大文件读取时,如果一次性都读取完,内存占用太大,使用生成器的方式,比较省内存)
def infinite_sevences():
while true :
yield 7
for i in infiniter_sevences():
rint(i)
#结果 7 7 7 7 7 7 7 7 7
简而言之,生成器允许你声明一个像迭代器一样的函数,也就是说他可以在for 循环中使用。
有限的生成器可以通过将他们作为参数传递给list函数来装换成列表。
def numbers(x):
for i in range (x):
if i %2==0:
yield i
print(list(numbers(11)))
#[0,2,4,6,8,10]
使用生成器可以提高性能,这是懒惰(按需)生成值的结果,这意味着更低的内存使用率.而且,在开始使用之前,我们不需要等到所有的元素都被生成。