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