创建生成器方法
方法一
要创建一个生成器,有很多方法。第一种方法很简单,只需将列表推导式的 [ ] 改为 ( )
创建 L 和 G 的区别仅在于最外层的 [ ] 和 ( ),其中 L 是列表,G 是生成器。我们可以直接打印 L 的每个元素,但是我们如何打印 G 的每个元素呢?如果要一个一个打印出来,可以通过 next() 函数获取生成器的下一个返回值:
运行结果:
运行结果:
生成器保存算法。每次调用next(G),都会计算G的下一个元素的值,直到计算出最后一个元素。当没有更多元素时,将引发 StopIteration 异常。当然,这种对 next() 的不断调用也太变态了。正确的方法是使用 for 循环,因为生成器也是可迭代的对象。所以,在我们创建了一个生成器之后,我们基本上从不调用 next(),我们通过一个 for 循环对其进行迭代,并且不需要关心 StopIteration 异常。
方法2
生成器非常强大。如果计算算法比较复杂,不能用类似于列表生成的for循环来实现,也可以用函数来实现。
例如,在著名的斐波那契数列中,除了第一个和第二个数字之外的任何数字都可以通过将前两个数字相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
斐波那契数列不能用列表推导式编写,但很容易用函数打印出来:
运行结果:
如果仔细观察,可以看到 fib 函数实际上定义了斐波那契数列的计算规则。它可以从第一个元素开始计算任何后续元素。这个逻辑实际上与生成器非常相似。
也就是说,上述函数和生成器仅一步之遥。要将 fib 函数变成生成器,只需将 print(b) 更改为 yield b:
运行结果:
在上面的 fib 示例中,我们在循环过程中不断调用 yield,这将不断中断。当然,必须为循环设置一个条件才能退出循环,否则会生成一个数字列表。同理,将函数改成生成器后,我们基本不会使用next()来获取下一个返回值,而是直接使用for循环进行迭代:
运行结果:
但是用for循环调用生成器时,发现无法获取到生成器的return语句的返回值。如果要获取返回值,则必须捕获 StopIteration 错误,并且返回值包含在 StopIteration 的值中:
运行结果:
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何在python中嵌套if10/06
- ♥ 如何在python中删除变量11/05
- ♥ python面向对象编程01/08
- ♥ 如何在 Python 的 numpy 库中使用 shape 函数11/16
- ♥ 如何在 Python 中创建一个固定长度的列表09/13
- ♥ python中从列表中删除元素的方法是什么?10/20
内容反馈