python 入坑路-生成器2-用函数做一个生成器 yield
斐波那契数列,每一个数是前面两个数相加得到的。 fn=fn-1+fn-2
1 def fib1(max): 2 n,tmp,a,b=0,0,0,1 3 while n<max: 4 print(b) 5 tmp=a+b #这里的赋值比较绕,但是比较容易理解。 6 a=b 7 b=tmp 8 n+=1 9 10 11 def fib(max): 12 n,a,b=0,0,1 13 while n<max: 14 print(b) 15 a,b=b,a+b #这里的赋值,逼格比较高,但是比较不容易理解,a,a+b 相当于先组成一个元组,t(a,a+b) ,分别赋值给前面,a=t[0]=b,b=t[1]=a+b 16 n+=1
下面就把 函数变成生成器 用 yield
def fib(max):
n,a,b=0,0,1
while n<max:
yield(b)
a,b=b,a+b
n+=1
fib(10)
<generator object fib at 0x03602780>
g=fib(10)
g.__next__()
1
生成器的作用,当需要生成大数据的时候,假设执行到这一部需要生成一个数据5分钟,可以先用生成器,跳过生成时间,在之后的程序中需要调用时再返回如下
1 def fib(max): 2 n,a,b=0,0,1 3 while n<max: 4 yield b 5 a,b=b,a+b 6 n+=1 7 return "done" 8 9 g=fib(10) 10 11 print(g.__next__()) 12 print("-----------") 13 print(g.__next__()) 14 print("-----------") 15 print(g.__next__()) 16 print("-----------") 17 print(g.__next__()) 18 print(g.__next__())
#输出结果 ,想进就进,想出就出,酣畅淋漓。
1
-----------
1
-----------
2
-----------
3
5
用for 循环取 generator 的值
def fib(max): n,a,b=0,0,1 while n<max: yield b a,b=b,a+b n+=1 return "done" g=fib(20) for i in g: print(i) #用for 循环不会 打印 return 的值 ,我也不知道为什么,老师没说
当循环只有10次,取第11次会抛出异常,
1 def fib(max): 2 n,a,b=0,0,1 3 while n<max: 4 yield b 5 a,b=b,a+b 6 n+=1 7 return "done" 8 9 g=fib(10) 10 11 print(g.__next__()) 12 print("-----------") 13 print(g.__next__()) 14 print("-----------") 15 print(g.__next__()) 16 print("-----------") 17 print(g.__next__()) 18 print(g.__next__()) 19 print(g.__next__()) 20 print(g.__next__()) 21 print(g.__next__()) 22 print(g.__next__()) 23 print(g.__next__()) 24 print(g.__next__())
#输出结果 ,错误提示已经结束,没有值可以取出。 可以捕捉异常,因为不知道 什么时候结果,所以也无法判断
Traceback (most recent call last):
File "D:/51cto/day4/generator.py", line 37, in <module>
print(g.__next__())
StopIteration: done
捕捉异常 try ... except
1 def fib(max): 2 n,a,b=0,0,1 3 while n<max: 4 yield b 5 a,b=b,a+b 6 n+=1 7 return "done" 8 9 g=fib(10) 10 11 #捕捉异常 12 13 while True: 14 try: 15 x=g.__next__() 16 print("g:",x) 17 except StopIteration as e: 18 print("循环结束了,你妈喊你回家吃饭",e.value) 19 break
def fib1(max):
n,tmp,a,b=0,0,0,1
while n<max:
print(b)
tmp=a+b
a=b
b=tmp
n+=1

浙公网安备 33010602011771号