Python创建生成器的两种方法

创建生成器方法
方法一
有很多方法可以创建一个生成器。第一种方法很简单,只要生成一个列表[ ]改成( )
创建L和G的区别在于最外层[ ]和( ),L是一个列表,G是一个生成器。我们可以直接打印L的每个元素,但是我们如何打印G的每个元素呢?如果要逐一打印,生成器的下一个返回值可以通过next()函数获得:

运行结果:


运行结果:

生成器保存算法,每次调用nextt(G),计算G的下一个元素的值,直到计算到最后一个元素,没有更多的元素,抛出Stopiteration的异常。当然,这种不断呼叫next()太不正常了,正确的方法是使用for循环,因为生成器也是一个可迭代的对象。因此,在我们创建了一个生成器之后,我们基本上永远不会呼叫next(),而是通过for循环迭代它,也不需要关心stopiteration的异常。
相关推荐:Python视频教程
方法2
generator非常强大。假如算法比较复杂,用类似列表生成的for循环无法实现,也可以用函数来实现。
例如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任何一个数都可以从前两个数加起来:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
斐波拉契数列不能以列表生成式书写,但很容易用函数打印出来:

运行结果:

仔细观察,我们可以看到fib函数实际上定义了斐波拉契序列的计算规则。我们可以从第一个元素开始计算任何后续元素。这种逻辑实际上与generator非常相似。
也就是说,上面的函数离generator只有一步之遥。要把fib函数变成generator,只需要print(b)改为yield b就可以了:

运行结果:

在上述fib的例子中,如果我们在循环过程中不断调用yield,我们将继续中断。当然,我们应该为循环设置一个退出循环的条件,否则就会列出一个数字。同样,在将函数更改为generator后,我们基本上从不使用next()获得下一个返回值,而是直接使用for循环进行迭代:

运行结果:

然而,当使用for循环调用generator时,发现generator的return语句的返回值无法获得。如果你想获得返回值,你必须捕捉stopiteration的错误。返回值包括在stopiteration的value中:

运行结果:
![1561771895525437.png ]].png](https://www.tulingpython.com/d/file/p/20251109/i2cpgppxwwi.png)
相关推荐:
三分钟看什么是Python生成器
