Python 中的yield 以及 generator

python 中的yield 以及generator

本篇文章浅谈python中的yield以及generator。很早就接触到了python生成器,当时在使用python2.7研究range 和xrange的区别,了解到xrange是一个生成器,而在python3中range直接就是生成器。就拿range与xrange比较得知,range产生一个列表,并且列表中的数据全部放置于内存中,如果我们要访问一个无限长列表中的某一个符合条件的数据时(比如斐波那契序列中的某一个数据),range的序列会存储在内存中,现在不可能采用这种方式,此时xrange就起作用了,xrange会存储当前访问数据的下一个数据地址,每一次访问的时候返回一个数据,不会将所有的数据压如内存,因此可以解决访问无限长数据的问题。而要构建一个生成器就必须使用yield。yield的功能类似于return,区别在于函数中有return 每一次调用该函数从函数头部运行到return位置返回return对应的值,return后内容不再运行,只要参数一样,无论调用多少次返回结果一样。而yield就不同了,可以将yield理解为等待调用(因为在多线程中yield功能是等待线程结束)。每一次调用含有yield的函数(即是generator)返回当前yield后面的值,然后yield后面内容继续运行。如果要保证生成器多次调用有效,那么yield一般放在循环里面,保证生成器每次执行完调用后会再次循环到yield位置等待调用。废话不多说,上代码:

实例一:最简单的yield

def gen1(n):
    print('generator runs')
    res = 0
    i = 0
    while i<n:
        yield i
        i = i+1
if __name__ == '__main__':
    for item in gen1(10):
        print(item)

输出从0-(N-1)的数据
输出结果:

10number

实例二:生成器产生斐波那契序列

输出前N个斐波那契序列中的数据代码如下:

def gen2(n):
    i = 0
    rpre = 1
    pre = 1
    cur = 0
    while i<n:
        if i<2:
            yield 1
        else:
            cur = rpre + pre
            yield cur
            rpre = pre
            pre  = cur
        i = i+1
if __name__ == '__main__':
    for item in gen2(20):
        print(item)

生成前20个斐波那契序列数据:

20斐波那契

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值