本篇文章浅谈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位置等待调用。废话不多说,上代码:
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)的数据
输出结果:
输出前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个斐波那契序列数据: