python-生成器
Posted liuxu2019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-生成器相关的知识,希望对你有一定的参考价值。
python-生成器
当我们需要在创建一个包含1亿数量元素的列表时,而我们可能只会使用其中的10个元素。如果通过列表的方式创建,则会存在极大的内存消耗。此时最好的方法就是需要多少就创建多少。
在Python中,这种一边循环一边计算后面元素的机制,称为生成器:generator。生成器只会保存计算下一个元素的算法,变循环边产生下一个需要的元素。
创建一个生成器的方法有两种:列表生成器&函数生成器
列表生成器
对于简单的需要,如果算法很简单。则可以使用列表程生成器。列表生成器很简单,只需要把列表推导式的[]
换成()
即可
访问元素时,可以通过next函数循环调用生成器,直到生成器中国所有的元素被输出完毕,再通过next调用则会报错。为了避免程序中断,可以通过for循环的额方式调用你生成器
g= (i for i in range(10))
print(g)
print(g.__next__())
print(next(g))
for i in g:
print(i, end=' ')
#output:
<generator object <genexpr> at 0x00000230962A5A48>
0
1
2 3 4 5 6 7 8 9
函数生成器
对于复杂的算法,列表生成器就难以满足需求。此时可以使用函数生成器。函数生成器用法也很简单。我们知道普通函数的返回值是通过return
返回,对于函数生成器,只需要把return
换为yield
即可。
我们下面通过一个斐波那契额数列简单介绍函数生成器的基本使用。
# 斐波那契数列
1 1 2 3 5 8 13 21 34 55 89 ....
思路,斐波那契额数列中每个元素是前面两个元素的加和(如果默认第一个元素是0)
需求:打印斐波那契数列中前10个数字
def fun_fib(n):
a = 0
b = 1
for i in range(n):
yield b
a,b = b, a+b
for i in fun_fib(10):
print(i, end=' ')
# output:
1 1 2 3 5 8 13 21 34 55
在普通函数中,程序进入函数后,执行到return
语句程序将跳出函数。再次进入函数后,从头开始直到遇到return
语句跳出函数,即程序将永远不会执行return
语句后面的语句。
但是在函数生成器中,程序进入函数后当执行到yield
语句后,程序跳出函数,当再次进入函数后,程序将继续执行yield
后的语句。
以上是关于python-生成器的主要内容,如果未能解决你的问题,请参考以下文章