三个程序分别来自网络,yield 总让我觉得像 c++ 里 list 中iterator 的感觉
关于解释,全部都在注释里,运行一下立刻就能明白
程序一
#encoding:UTF-8
# **********************************************************
# ** 第一个程序
# ** 来自 https://blog.csdn.net/u013205877/article/details/70332612
# ** 代码示例1:
# **********************************************************
def yield_test(n):
for i in range(n):
yield call(i) # 看起来 就是c++里的iterator 用完一次之后就不能再用了
print("i=",i)
# 做一些其它的事情
print("do something.")
print("end.")
def call(i):
return i*2
#使用for循环
for i in yield_test(5):
print(i,",") # 主程序print 之后,还是要进到子程序yield_test 中去
程序二
#encoding:UTF-8
# **********************************************************
# ** 第二个程序
# ** 来自 https://blog.csdn.net/lftaoyuan/article/details/78915518
# **********************************************************
def s():
print('study yield')
print('study yield')
print('study yield')
print('study yield')
m = yield 5
print(m)
d = yield 16
print('go on!')
c = s()
s_d1 = next(c) # 相当于send(None)
s_d2 = c.send('Fighting!') # (yield 5)表达式被赋予了'Fighting!'
print('My Birth Day:', s_d1, '.', s_d2)
程序三
#encoding:UTF-8
# **********************************************************
# ** 第三个程序
# ** 来自 https://blog.csdn.net/lftaoyuan/article/details/78915518
# **********************************************************
def s():
print('study yield')
# yield的作用其实就是跳出子函数,之后在主程序中执行 next 或者 send,然后 m 获得一个值
m = yield 5 # 如果是主程序里是 next 那么m就获得的是None 空值
print(m) # m在返回主程序又send 到子程序后 变成了 'Fighting!'
d = yield 16
print('go on!') # 在最后一个yield后面的程序 一般不再执行,否则会报错
c = s()
s_d = next(c) # 相当于send(None) s_d 此时是 yield 5 的返回值5
print(s_d) # 输出了5
# next(c)
d_main = c.send('Fighting!') # (yield 5)表达式被赋予了'Fighting!'
print(d_main)