gennerator的作用隔跟list类似,但是它不直接生成,而是记录了一种计算方式(算法),每次要用到其中的一个值的时候再去计算后返回结果。
- 一般生成方式:中括号里面填入列表生成式,eg:
>>> (r*r for r in range(10)) <generator object <genexpr> at 0x7f8bb3a16e08>
调用方式:
>>> gg = (r*r for r in range(10)) >>> next(gg) 0 >>> next(gg) 1 >>> next(gg) 4
>>> gg = (r*r for r in range(10)) >>> for g in gg : ... print(g) ... 0 1 4 9 16 25 36 49 64 81
- 用函数+yield关键字生成:
>>> def obb(max): ... num,a,b = 0,0,1 ... while num<max: ... yield b ... a,b = b,a+b ... num= num+1 ... return 'okok' ... >>> b = obb(5) >>> b <generator object obb at 0x7f8bb3a2e0a0> >>> next(b) 1 >>> >>> next(b) 1 >>> next(b) 2 >>> next(b) 3 >>> next(b) 5
迭代完了之后的generator无法再次使用:
>>> c = obb(6) >>> for s in c: ... print(s) ... 1 1 2 3 5 8 >>> for s in c: ... print(s) ... >>> >>> next(c) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
使用while不断遍历,知道最后获得正常的renturn 结果:
>>> d = obb(4) >>> while True: ... try: ... print(next(d)) ... except StopIteration as e : ... print('generator return value : ',e.value) ... break ... 1 1 2 3 generator return value : okok