Discuss / Python / hi,all,关于第一次send(None)的参数必须是None,我有些疑问?

hi,all,关于第一次send(None)的参数必须是None,我有些疑问?

Topic source

aio2014

#1 Created at ... [Delete] [Delete and Lock User]
在此插入代码
def h():
    print('xx')
    m = yield 5
    print(m)
    d = yield 12
    print('aa')

  c = h()
  c.send(None)

c.send(None)是执行到哪?m = yield 5么?如果是那为什么说第一次没有yield语句来接收这个值?如果不是,那为什么c.send(None)的返回值是5?

网上看到的解释: send(None)发给yield,但没有给n赋值,也就是说执行到yield r就挂起了,返回值为r(此时r值为'')

补充一下,send(None)只负责启动生成器,没有赋值,执行下一个send(n)时才赋值

GirlBeautiful

#4 Created at ... [Delete] [Delete and Lock User]

第一次执行到

m = yield 5

首先执行yield 5,执行后没有返回值,即m为空,返回值需要下次调用时赋予。yield 5执行完后就停止继续执行,可以理解为执行指针停止在yield 5的前面,等待给变量m赋值的位置。下次调用generator函数时从给m赋值开始执行。

generator函数执行后,遇到yield表达式,执行该表达式后就停止执行,返回yield表达式中yield后部的值。例如yield r,返回r 作为generator函数执行后的结果给调用者。yield表达式本身没有返回值,它的返回值需要等到下次调用generator函数时,由send(args)函数的参数赋予。

因为第一次调用yield表达式,还没有接受参数赋值的变量,所以只能传递None作为send的参数。

第一次必须是send(None),这是用于启动生成器,如果不是None会报错

第一次send(None)执行到yield r,返回produce,第二次send(1),则从n接收send值1开始,一直执行到yield r,再次返回produce


  • 1

Reply