备注:仅供自己参考
yield 的理解 : 我目前理解 yield 可以分2种情况
第一种情况: ' yield 1 '
理解: 和 print(1)的输出一样,但会在内存保存值。
例子:
def AAA():
r = 0
print('++++++START+++++++++')
while r <= 5:
yield 9
print('[AAA] AAA r= %s' % r)
r +=1
print('+++++++END++++++++++')
for i in AAA():
print (i)
输出结果:
++++++START+++++++++
9
[AAA] AAA r= 0
9
[AAA] AAA r= 1
9
[AAA] AAA r= 2
9
[AAA] AAA r= 3
9
[AAA] AAA r= 4
9
[AAA] AAA r= 5
+++++++END++++++++++
第二种情况:' x = yield 9 '
理解:和 print(1)的输出一样,但会在内存保存值;x 的值为 yield 保存值的 传递次数。
例子1 :
def AAA():
r = 0
print('++++++START+++++++++')
while r < 3:
x=yield 9
print('[AAA] AAA r= %s' % r)
print('[AAA] AAA x= %s' % x)
r +=1
print('--第%s次循环结束--' %r)
print('+++++++END++++++++++')
for i in AAA():
print (i)
输出结果:
++++++START+++++++++
9
[AAA] AAA r= 0
[AAA] AAA x= None
--第1次循环结束--
9
[AAA] AAA r= 1
[AAA] AAA x= None
--第2次循环结束--
9
[AAA] AAA r= 2
[AAA] AAA x= None
--第3次循环结束--
+++++++END++++++++++
备注:因为 没有传递 yield值,所以x 为 None
例子2:
def AAA():
while 1:
print('[AAA]-START')
x=yield 9
print('[AAA]-x=%s' %x)
print('[AAA]-END')
def BBB(a):
print('[BBB]-START')
r = a.send(None)
n=0
while n < 3:
n+=1
r = a.send(n)
print('[BBB]-r=%s' %r)
print('[BBB]-第%s次循环END\n' %n)
a.close()
BBB(AAA())
输出结果:
[BBB]-START
[AAA]-START
[AAA]-x=1
[AAA]-END
[AAA]-START
[BBB]-r=9
[BBB]-第1次循环END
[AAA]-x=2
[AAA]-END
[AAA]-START
[BBB]-r=9
[BBB]-第2次循环END
[AAA]-x=3
[AAA]-END
[AAA]-START
[BBB]-r=9
[BBB]-第3次循环END
备注:每次 运行 ‘a.send(None)’ 和 ‘x=yield 9’ 都会切换 函数,
例子2从 函数 BBB()开始,第一次运行经过 ‘r = a.send(None)’时,
切换至函数AAA()。然后运行经过‘x=yield 9’时,又切换回函数BBB(),
并且 将 9 返回给 ‘ r ’,‘ x ’则记录 yield 的次数。