Python 中的yield 以及 generator

来源:互联网 发布:微商销售网站源码 编辑:程序博客网 时间:2024/04/29 21:22

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+1if __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+1if __name__ == '__main__':    for item in gen2(20):        print(item)

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

20斐波那契

原创粉丝点击