生成器作用:节省内存空间。通过一边循环一边计算的机制称为生成器:generator
创建生成器:
1、将列表推导式的[]改为(),就创建了一个生成器。通过next()函数或for语句获取generator的值。
>>> l = [x*x for x in range(10)] >>> l [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x*x for x in range(10)) >>> g <generator object <genexpr> at 0x026F50A8> >>> next(g) 0 >>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g) 25 >>> next(g) 36 >>> next(g) 49 >>> next(g) 64 >>> next(g) 81 >>> next(g) Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> next(g) StopIteration >>> g <generator object <genexpr> at 0x026F50A8> >>> for n in g: print(n) >>> >>> >>> g = (x*x for x in range(10)) >>> g <generator object <genexpr> at 0x026F8788> >>> for n in g: print(n) 0 1 4 9 16 25 36 49 64 81 >>
2、通过函数的方式创建生成器:若一个函数中包含yield关键字,则此函数为一个generator
def fib(max): n,a,b = 0,1,1 while n < max: print(b) a, b = b, a+b n = n+1 return "done" def fib1(max): n,a,b = 0,1,1 while n < max: yield(b) a, b = b, a+b n = n+1 return "done" >>> fib(6) 1 2 3 5 8 13 'done' >>> fib1(6) <generator object fib1 at 0x03225210> >>> >>> next(fib(6)) 1 2 3 5 8 13 Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> next(fib(6)) TypeError: 'str' object is not an iterator >>> next(fib1(6)) 1 >>> for n in fib1(6) SyntaxError: invalid syntax >>> for n in fib1(6): print(n) 1 2 3 5 8 13 >>>
def odd(): print("step 1") yield 1 print('step 2') yield 3 print('step 3') yield 5 >>> odd() <generator object odd at 0x02D051C0> >>> for i in odd(): print(i) step 1 1 step 2 3 step 3 5 >>> next(odd()) step 1 1 >>> next(odd()) step 1 1 >>> next(odd()) step 1 1 >>> o = odd() >>> next(o) step 1 1 >>> next(o) step 2 3 >>> next(o) step 3 5 >>> next(o) Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> next(o) StopIteration
注意:使用for循环调用生成器时,不能获取生成器return语句的返回值。返回值包含在stopIteration的value