时间:2021-07-01 10:21:17 帮助过:21人阅读
send例子:
def f(): print("start") current = yield "hello" print(‘current=‘, current) while True: value = yield "bad" print("value=",value) # value = value + ‘not‘ # 此行会报错,因为value会为整形, 不能和字符串进行相加 g = f() s1 = next(g)# 这一步不能少 # 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值 print(g.send(10)) # 生成器调用第一次send时,将send参数10代替表达式"yield hello"的值,赋给current, # 然后程序往下执行,在遇到yield bad停止,将"bad"作为第一次send()函数的返回值返给外界 print(g.send(20)) # 生成器第二次调用send时,将send参数20代替表达式"yield bad"赋给 value # 程序往下执行,然后遇到yield bad停止,将"bad"作为第二次send()函数的返回值返给外界View Code
2 yield与生成器generator
函数里面使用了yield不再是函数,而是一个生成器generator。 比如
def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print b a, b = b, a + b n = n + 1
当执行g = fab(5)时,不是调用函数,而是实例化一个生成器对象。 当循环g对象或者next(g)时才会调用fab函数里面的代码
def test(): # print(‘one‘) yield 1 # print(‘two‘) yield 2 g = test() for i in g: print(i) # 应该和下面效果是一样的: g = test() res = next(g) print(res) # 首次遇到next()会执行test代码,并停留在yield 1 处, # 同时将yield 后面表达式的值作为next的返回值返回给外界 # res = next(g) print(res) # 接着上面保存的地方,运行print two, # 碰到yield 2 ,停止并把后面的2作为Next的返回值返回给外界View Code
3 生成器是有状态的,调用者不可反复使用它。比如:
def test(): yield 1 yield 2 g = test() for i in g: print(i) # 下面这里是没有效果的 for i in g: print(‘hello‘) print(i)View Code
[oldboy-django][4python面试]有关yield那些事
标签:none djang 实例 cab send 就会 并且 tor span