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 iyield i
        i = i+1
if __name__ == '__main__':
    for item in gen1(10):
        print(item)

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

Python 中的yield 以及 generator_第1张图片

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

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

def gen2(n):
    i = 0
    rpre = 1
    pre = 1
    cur = 0
    while iif 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个斐波那契序列数据:

Python 中的yield 以及 generator_第2张图片

你可能感兴趣的:(Python)