Python生成器

在Python中,⼀边循环⼀边计算的机制,称为⽣成器:generator。比如在创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素的话,那后面绝大多数元素占用的空间都白白的浪费,所以如果列表元素可以按照某种算法推算出来,那么我们在循环的过程中不断推算出后续的元素。

创建生成器方法1:

只要把一个列表生成式的[] 改成()。

L = [ x*2 for x in range(5)]
print(L)

G = (x*2 for x in range(5))
print(G)

#执行结果
#[0, 2, 4, 6, 8]
#<generator object <genexpr> at 0x02D0A148>

 L列表的打印出来的结果就是一个列表,但是G打印出来的是一个generator, 从结果猜测应该可以看到是一个object在 0x02D0A148 这个地址中,如果要得到生成器里面的元素,可以通过next() 函数获得生成器的返回值。

G = (x*2 for x in range(5))
print(G)

print(next(G)) #0
print(next(G)) #2
print(next(G)) #4
print(next(G)) #6
print(next(G)) #8

⽣成器保存的是算法,每次调⽤ next(G) ,就计算出 G 的下⼀个元素的值,直到计算到最后⼀个元素,没有更多的元素时,抛出 StopIteration 的异常。当然,这种不断调⽤ next() 实在是太变态了,正确的⽅法是使⽤ for 循环,因为⽣成器也是可迭代对象。所以,我们创建了⼀个⽣成器后,基本上永远不会调⽤ next() ,⽽是通过 for 循环来迭代它,并且不需要关⼼StopIteration 异常。

生成器创建方法2:

用函数来实现。我就用斐波那契函数来举例子,斐波那契数列应该很熟悉了,除第⼀个和第⼆个数外,任意⼀个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...

def fib():
    a, b = 0, 1
    for x in range(5):
        yield b
        a, b = b, a + b

r = fib()
print(r) #<function fib at 0x00884228> 可以看到结果是生成器

在函数里面加上yield 就可以生成,如果要得到结果可以使用 next()函数,也可以用for循环

#方法一
print(next(r))
#方法二
for x in r:
    print(x)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值