Python生成器

 1 #author F
 2 
 3 #迭代器
 4 
 5 #列表生成式
 6 list_build = [2*i for i in range(0, 24)]  #2*i可以改成某函数
 7 print(list_build)
 8 # 相当于三行代码
 9 list_man_made = []
10 for i in range(0, 24):
11     list_man_made.append(2*i)
12 print(list_man_made)
13 
14 #生成器 : 只有在调用时候才会产生对应的数据  只记住当前的位置 只有一个__next__()方法
15 # cc = [2*i for i in range(0, 24000000000)]
16 '''
17 c = ( 2*i for i in range(0, 24000000000)) #c存的是内存地址,存了一个算法,并没有将整个列表生成
18 for i in c:
19     print(i)
20 #生成器和列表的区别是:调用时候才有数据 不调用则没有数据 加快了运行时间
21 print(c.__next__())
22 '''
23 
24 #斐波那契数列
25 #1,1,2,3,5,8,13,21,...
26 def fib(max):
27     n, a, b = 0, 0, 1
28     while n<max:
29         print(b)
30         a, b=b, a+b
31         n = n+1
32     return 'done'
33 ##赋值语句 a,b=b,a+b 赋值过程
34 # t = (b, a+b) #t是一个tuple
35 # a=t[0]
36 # b=t[1]
37 fib(100)
38 
39 def fib1(max):
40     n, a, b = 0, 0, 1
41     while n<max:
42         yield b
43         a, b=b, a+b
44         n = n+1
45     return 'done'  #用for循环done不会打印
46 print(fib1(10))
47 f = fib1(10)
48 print(f.__next__())
49 print(f.__next__())
50 print("干点别的事去")
51 print(f.__next__())
52 print(f.__next__())
53 print("==start==")
54 for i in f:
55     print(i)
56 
57 ##函数有yield存在就回变成一个生成器 return的值用异常抓取
58 
59 def fib2(max):  #这个已经不是函数了  只要有yield存在 就不是函数了 
60     n, a, b = 0, 0, 1
61     while n<max:
62         yield b
63         a, b = b, a+b
64         n = n+1
65     return "done"  #可以用来抛出异常
66 
67 g = fib2(6)
68 while True:
69     try:
70         x = next(g)
71         print("g:",x)
72     except StopIteration as e:
73         print("Generator return value:", e.value)
74         break

 

posted @ 2017-06-16 14:50  Bird_getUpEarly  阅读(133)  评论(0编辑  收藏  举报