环境
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 使用浅析