参考:https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do
Python 中的 yield
函数有 类似于 return
的功能,其区别在于 return
返回之后就不会再进入这个函数了,而 yield
则会再次返回这个函数
这在当你需要返回的数据量特别大的时候,用 return
返回会占据很大的内存空间,如果使用yiled
加上for
等就可以实现迭代返回,每次需要多少就返回多少,减少内存的占用。
比如以下函数:
def f1():
a = [1,2,3,4,5]
b = [6,7,8,9,0]
for i, j in zip(a,b):
print("f1: ",(i,j))
yield i,j
def f2():
c = f1()
for i, j in c:
print("f2: ",(i,j))
yield i,j
z = f2()
for i, j in z:
print("Main",(i,j))
执行以上程序,其输出为:
('f1: ', (1, 6))
('f2: ', (1, 6))
('Main', (1, 6))
('f1: ', (2, 7))
('f2: ', (2, 7))
('Main', (2, 7))
('f1: ', (3, 8))
('f2: ', (3, 8))
('Main', (3, 8))
('f1: ', (4, 9))
('f2: ', (4, 9))
('Main', (4, 9))
('f1: ', (5, 0))
('f2: ', (5, 0))
('Main', (5, 0))
可以看到,when you call the function, the code you have written in the function body does not run.
- 当调用这个函数时,函数中的代码并没有被执行,而是等到
for
迭代时才跳回去执行代码; - 调用这个函数 比如
z=f2()
,只是返回一个 generator object,f2函数里面的for
循环并没有被立即执行。