这个解释跟你理解的不是一个东西,上面很多版友已经解释了。你这个例子只用到了yield的一部分,还有一种很骚的语法你还没碰到,yield不仅右边有东西,左边也有东西,形如args = yield expr,你理解的只是expr的值,不是yield expr的值,yield expr作为一个整体还有一个值,print(expr)和print(yield expr)就不一样。
docs写得很严谨,里面的定义不可望文生义。首先明确yield expr是一个表达式,本身是有值的,但不是expr的值。case=fab(3),执行完这句后,fab还没有执行里面的函数体;必须拿鞭子抽它一下,就是运行next(case),程序run起来后执行到yield时,卡死在那里,控制流程转移到外面,现场保留;要想恢复,就是docs中提到的resuming,就拿鞭子再抽一下,运行next(case),resuming执行到下一次yield卡死。resuming除了你知道的next方法之外,还可以运行case.send(val),这样yield b这个整体表达式的值就是val,这个val还可以再赋给其它变量并用这个变量做其它事情,颇有点变相传递参数的味道。你原来的程序,由于没有显示调用send,故每次resuming后(yield b)这个表达式的值是None,但这个表达式孤零零的自成一行,也没有赋给其它变量,所以往外产出值的行为更被关注,恢复现场反而静悄悄的。我认为这是generator的本意,单向向往外产出值。但你稍微改写一下,写成args = (yield b),print(args)。外面除了第一次必须用next(case)抽一鞭子,之后调用case.send(xxx),就会发现args就是xxx,这等于打开了双向管道,不仅向外输出,还能接受反馈,generator进化成了coroutine。
【 在 HYNOS 的大作中提到: 】
: 感谢!你讲的跟我理解的一样.实测看来也确实如此,next()就是在上一个动作的基础上再
: 动作一次,该是none就是none,该是别的就是别的.
: 我没能理解的下面这句话其实是来自
https://docs.python.org/zh-cn/3/reference/e: ...................
--
FROM 219.142.144.*