生成器generator

受内存限制,列表容量有限,且创建较多元素的列表时,只访问前几个元素,后面元素占用的空间就浪费了


生成器:一边循环一边计算,不必创建完整的list,从而节省空间


创建生成器的两种方法:

1、把一个列表生成式[]换成()

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

2、定义一个函数中包含有yield字段,那该函数就不是一个普通的函数,而是一个生成器generator

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
注:a,b=b,a+b  =右边的先同时计算,再分别赋值给左边、


生成器的调用:一般使用for循环迭代,说明生成器也是一个可迭代的对象。

for循环一般需要给一个判断结束循环

>>> for n in fib(6):
...     print(n)
...
1
1
2
3
5
8
使用for循环调用generator时,无法拿到最后的return返回值,需要捕捉 StopIteration 错误,返回值包含在 StopIteration value 中:

>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
...     except StopIteration as e:
...         print('Generator return value:', e.value)
...         break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值