生成器
一、生成器表达式
- 在Python中使用了
yield
的函数被成为生成器(generator)
当一个列表中含大量元素时,如果一次性生成这些元素并保存在列表中,将大量的内存空间,对于这个问题,我们可以通过生成器(generator)来解决,根据需要进行计算并获取列表中某个元素的值。
对于生成器对象,也可以向其他可迭代对象一样使用for循环遍历对象中的每一个元素。
- 将列表生成表达式中的一堆中括号改为小括号即可
g = (x*x for x in range(10)) # 创建一个生成器对象并赋给g
print('g的类型:', type(g))
for i in g:
print(i, end='')
g的类型为:<class’generator’>
0 1 4 9 16 25 36 49 64 81
如果生成元素的方法比较复杂,不适合用for循环方式实现,我们还可以借助
yield
关键字利用函数四号线生成器的功能。
例:实现faclist
函数,一次生成1的阶乘,2的阶乘…n的阶乘。
def faclist(n): #定义函数faclist
result = 1
for x in range(2, n+1): # 在2至n范围内一次取值
yield result # 遇到yield即暂停执行并返回result,下次执行时继续从此处开始执行
result = x * result # 将x乘到result上
for y in Faclist(10): # 遍历faclist并输出每个元素的值
print(y)
输出值:
1 2 6 24 120 720 5040 40320 362880
二、yield关键字
- 使用yield实现斐波那契数列:
import sys
def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10) # f是一个迭代器,由生成器返回生成
while True:
try:
print(next(f), end=' ')
except StopIteration:
sys.exit()
输出值:
0 1 1 2 3 5 8 13 21 34 55