在函数种使用yield表达式代替return即是生成器。例如:
def fun():
i=0
while i<5:
yield i
i+=1
print(fun())
## <generator object fun at 0x000001EB2ECF5F00>
#得到的不再是一个返回值而是一个生成器对象
生成器的使用则是在每次调用的时候提供一个数据并且记住当前状态,换句话来说是每次调用执行到yield的时候暂停并保留状态下一次调用则从下一个语句继续执行。
生成器是一种特殊的迭代器,它同样也支持next()函数:
def fun():
i=0
while i<5:
yield i
i+=1
a = fun()
print(next(a))
print(next(a))
print(next(a))
## 0
## 1
## 2
以下是使用生成器来求Fibonacci数列
def fib():
a, b = 0, 1
while True:
yield b
a, b = b, a + b
c = fib()
for i in range(10):
print(next(c))
## 1 1 2 3 5 8 13 21 34 55
生成器表达式:之前接触过了列表推导式,但是发现元组无法使用相同的推导式,但是学完生成器之后,我们发现其得到的结果是一个生成器,于是乎便有了生成器表达式
t = (i ** 2 for i in range(5))
print(t)
## <generator object <genexpr> at 0x000001EC3748EC20>
for i in t:
print(i)
## 0 1 4 9 16