Python 关键字Yield

环境

Python 2.7

可迭代对象
array = range(1, 3)
print array
for i in array:
    print i

#>>> [1, 2]
#>>> 1
#>>> 2

列表array时一个可迭代对象,通过for语句迭代列表。通过打印知道array是以一个完整的列表[1, 2]存在内存中的。

生成器
array = (x * x for x in range(3))
for i in array:
    print i
print (array)
#>>> 0
#>>> 1
#>>> 4
#>>> <generator object <genexpr> at 0x0000000005002FC0>

range不同,xrange() 返回的是生成器。range计算了所有的结果,放在内存中,而生成器只有在迭代的时候才会计算。想想看,把range(3)换成range(100000),返回的列表[...]将占用一大块内存,用了生成器,就可以节省这一块内存。


先上一个带有yield的函数

def createGenerator() :
    mylist = range(3)
    for i in mylist :
        yield i*i

>>> x = createGenerator() # x <generator object createGenerator at 0x0000000004922FC0>
>>> for i in x:
    print i
0
1
4

带有yield的函数,python解释器将其视为一个生成器。调用函数createGenerator()返回的是一个可迭代的生成器。在for循环的过程中,每次都会执行函数体内的代码,并且每次执行到yield i*i时会停止,语句yield i*i返回迭代值。下次迭代时会从yield i*i的下一句开始,继续执行。

待续

参靠网址
1.(译)Python关键字yield的解释
2.Python yield 使用浅析

猜你喜欢

转载自blog.csdn.net/soga238/article/details/81091101