什么是生成器
当我们讨论生成器的时间一般会涉及两个方面
生成器函数 :生成器函数类似正常的函数,但是当它需要返回值的时候使用 yield 来代替 return。如果一个函数包含 yield,那么就可以说这个函数是生成器函数。
def gen_fun():
yield 'a'
yield 'b'
for item in gen_fun():
print(item)
执行以上代码,输出:
a
b
生成器对象 :生成器函数返回的就是生成器对象,通过调用生成器对象的 next() 方法(Python3 为 __next__() 或内置的 next 函数)或 for in 语法来使用生成器对象。
def gen_func():
yield 'a'
yield 'b'
# 这里的 g 就是一个生成器对象
g = gen_func()
# 通过 for in 来去除生成的数据
for item in g:
print(item)
执行以上代码,输出:
a
b
生成器有什么特点
同样是可以用 for in 来遍历对比直接返回 ['a', 'b'] 的正常函数,它具有以下特殊之处:
它并没有把所有生成的值存在内存中,而是在运行时生成值。
它返回的生成器对象仅可遍历一次,例如上述例子中再次使用 for item in g 遍历时会发现什么没输出。
生成器的应用场景
生成器运行时生成值时的特性可以避免一次性创建大量的对象占有过多的内存,它能够让你在许多情况下以一种优雅而又更低内存消耗的方式简化 无限 序列相关的操作。实际场景中当需要大量生成数据的时候都是考虑让生成器登场的时候。
以下是一个经典的实现斐波那契数列生成器的例子:
def fib(n):
a, b = 0, 1
for item in range(n):
yield b
a, b = b, a + b
for item in fib(5):
print(item)
执行以上代码,输出:
1
1
2
3
5