python怎么生成,python自动生成
创建生成器方法
方法一
有许多方法可以创建一个生成器。第一种方法非常简单,只需将一个列表生成公式的[]改为()。
创建L和G的区别只是最外面的[]和()。l是列表,G是生成器。我们可以直接打印出L的每一个元素,但是怎么才能打印出G的每一个元素呢?如果想把它们一个一个打印出来,可以通过next()函数得到生成器的下一个返回值:
运行结果:
运行结果:
生成器保存算法。每次调用next(G)时,都会计算G的下一个元素的值。直到计算完最后一个元素,当没有更多的元素时,抛出StopIteration异常。当然,这种不断调用next()的情况确实很不正常。正确的做法是使用for循环,因为生成器也是一个迭代对象。所以,我们创建生成器后,基本上从不调用next(),而是通过一个for循环迭代,不需要关心StopIteration异常。
相关:《Python视频教程》
方法2
发电机非常强大。如果计算算法复杂,无法实现类似列表生成的for循环,也可以通过函数实现。
比如著名的斐波那契数列,除了第一个和第二个数字,任何数字都可以通过前两个数字相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34,
斐波纳契数列不能通过列表生成来编写,但通过函数打印出来很容易:
运行结果:
仔细观察发现,fib函数实际上定义了斐波那契数列的计算规则,可以从第一个元素开始,计算任何后续元素。这个逻辑其实和生成器很像。
也就是说,上述功能离生成器只有一步之遥。要将fib函数转换为生成器,只需将print(b)改为产出b:
运行结果:
在上面fib的例子中,我们在循环中一直调用yield,它会不断地被中断。当然,需要为循环设置一个退出循环的条件,否则会产生一个序列。同样,将函数改为generator后,我们基本上再也不用next()来获取下一个返回值,而是直接使用for循环迭代:
运行结果:
但是用for循环调用生成器时,发现无法获取生成器的return语句的返回值。如果要获得返回值,必须捕捉StopIteration错误,返回值包含在StopIteration的值中:
运行结果:
相关建议:
三分钟理解什么是Python生成器。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。