Python小技巧5:需要动态生成列表的时候,考虑使用生成器替代

典型代码:

def mygen():
    i = 0
    while i < 100:
        yield i
        i += 1


if __name__ == '__main__':
    gen = mygen()
    for item in gen:
        print(item)

什么是生成器:

生成器是一个包含yield表达式的函数,只要一个函数中有了yield表达式,当调用这个函数的时候,函数体的代码压根就不会执行,它只是会返回一个生成器对象。如果访问一个生成器迭代器,每次访问到的值都是动态生成的(比如典型代码中的变量i),即是yield右边的值,并冻结当前状态,等待下一次访问。对于生成器对象可以将其理解为一种值的顺序生成规则的描述,生成器对象会一直维护自己的生成规则上下文,直到结束(当然,也可以不结束)。


应用场景:

如果需求是动态的生成一个列表,然后其它函数会一次性访问这个列表中的项,做相应的处理工作。


带来的好处:

1. 不必返回整个列表对象,只返回生成规则描述,如果元素数量较大,可以节省大量内存。生成器甚至可以生成一个无限序列,只要生成规则永不停止即可。

2. 逻辑清晰,一眼就能看到值是如何返回的。


注意的点:

生成器对象是有状态的,只能访问一次。这也很容易理解,因为生成器只是一个值的生成规则,加上其上下文,不像列表一样保存了所有的值。

也可以使用原生的迭代器协议访问生成器,但是需要手动处理迭代器结束时的StopIteration异常:

    gen = mygen()
    while True:
        try:
            data = next(gen)
            print(data)
        except StopIteration:
            print('Iteration done')
            break

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值