生成器
要创建一个generator:
-
第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator;
-
第二种方法,只需要把print(b)改为yield b就可以
**难点理解:**generator和函数的执行流程不一样。函数是顺序执行,遇到return
语句或者最后一行函数语句就返回。而generator函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行;
generator函数的“调用”实际返回一个generator对象;
可以通过next()函数获得generator的下一个返回值,但是更多是使用for循环,因为generator也是可迭代对象;
#要创建一个generator,第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator
#创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
L = [x * x for x in range(10)] #列表生成式
g = (x * x for x in range(10)) #generator
#可以通过next()函数获得generator的下一个返回值
#但是更多是使用for循环,因为generator也是可迭代对象
for n in g:
print(n)
#普通函数计算斐波拉契数列
def fib1(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
#调用普通函数
fib1(6)
#创建一个generator,第二种方法,只需要把print(b)改为yield b就可以
#如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
#generator函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
#把函数改成generator后,基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代
#创建一个generator,计算斐波拉契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
#调用generator函数计算斐波拉契数列
for n in fib(6):
print(n)