特点:只有在调用时,才会生成相应的数据只记录当前位置只有一个__next__() 方法 #左右两边两个下划线组成的所以,我们创建了一个 generator 后,基本上永远不会调用__next__(),而是通过 for 循环来迭代它,并且不需要关心 StopIteration 的错误。generator 非常强大。如果推算的算法比较复杂,用类似列表生成式的 for 循环无法实现的时候,还可以用函数来实现。
仔细观察,可以看出,fib 函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似 generator。也就是说,上面的函数和 generator 仅一步之遥。要把 fib 函数变成 generator,只需要把 print(b) 改为 yield b 就可以了
- def fib(max) : n,
- a,
- b = 0,
- 0,
- 1
- while n < max: print(b) a,
- b = b,
- a + b n = n + 1#
- return 'done'暂时没用到'''
- 注意,赋值语句:
- a, b = b, a + b
- 相当于:
- t = (b, a + b) # t是一个tuple
- a = t[0]
- b = t[1]15 '''
但是用 for 循环调用 generator 时,发现拿不到 generator 的 return 语句的返回值。如果想要拿到返回值,必须捕获 StopIteration 错误,返回值包含在 StopIteration 的 value 中:
关于这个异常处理,后续会继续发博客更新。。。
- f = fib(5)
- while True:
- try:
- x = f.__next__()
- print("f:",x)
- except StopIteration as e: #当try中的程序执行错误了,才会执行except下面的代码
- print("Generator return value:",e.value)
- break
- #执行结果
- f: 1
- f: 1
- f: 2
- f: 3
- f: 5
- Generator return value: ----done--- #抓获StopIteration错误,返回值包含在StopIteration的value中,就不会再报错f.__next__()
来源: https://www.cnblogs.com/ManyQian/p/8151344.html