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
posted @ 2018-01-02 15:18  东郭仔  阅读(129)  评论(0)    收藏  举报