1 yield 在使用send, next时候的区别(举例m = yield 5)

  无论send,next首先理解m = yield 5 是将表达式"yield 5 "的结果返回给m, 而不是m=5这么简单, 所以涉及到如何获取表达式yield 5的值,这就和next,send有关。

  当send(arg)时,就会将arg 认为yield 5表达式的结果赋给m,而如果是next,就会将None作为yield 5表达式的结果付给m;

  所以可认为next 等效于send(None),除了第一次next外

  

  区别就是:

    使用next()时,第一次next, 在遇到yield停止,并且将yield右边的表达式“5”作为next函数的返回值返回给外界; 之后的next,会将None作为yield 5表达式的值赋给m,

    程序往下执行,遇到下一个yield时,将yield右边的表达式5作为该次的next的返回值

    使用send(arg)时(前面必须已经使用了next), 将arg作为yield表达式"yield 5"的值,赋给m;程序往下执行,然后将下个yield的右边表达式"5"作为send函数的返回值 

  

  next例子:

def f():
    print("start")
    current = yield "hello"
    print('current=', current)
    while True:
        value = yield "bad"
        # value = value + 'not' # 此行会报错,因为value会为None, 不能和字符串进行相加


g = f()
s1 = next(g)
print('s1=',s1)
# 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值

s2 = next(g)
print('s2=', s2)
# 第二次的next,会将None作为yield表达式" yield hello"的值赋给current, 即current = None
# 然后程序往下执行,遇到yield "bad"停止,将yield右边的表达式"bad"作为第二次next的返回值

s3 = next(g)
print('s3=',s3)
# 第三次next,会将None作为yield表达式”yield bad"的值赋给value, 即value = None,
# 程序往下执行,遇到value = yield "bad"停止,将"bad"作为第三次next的返回值
View Code

相关文章: