python-生成器,,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>012 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+bfor 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-生成器

评论关闭