谢谢!又继续研究了好久,发现造成我的困惑的关键,应该就是“yield值” 和 “yie
ld表达式的值”的区别。整理一下目前我的理解,请各位看看对不对:
def test():
r='text'
while True:
result=yield r
t=test()
1.以上代码中,result=yield r 是一个yield表达式(yield expression)。
2."yield r"不是一个yield表达式,它只是输出一个yield 值。
3.next(t)将会赋值给result一个None,type是<class 'NoneType'>。这个操作跟r无关
.
4.之所以next(t)操作将会赋值给result一个None,是因为next(t)相当于t.send(None)
如果以上理解正确,有一点就感觉很古怪:
如果使用跟return类似的代码方式,也就是以上第4行写成 yield r,意思是“整个函数
运算完毕后输出r值”,那么print(t)就是r值,没问题;
如果写成result=yield r ,意思似乎是“整个函数运算到此处时,给result赋了个值”
,这是一个“操作动作”,但并没有给出一个可供打印的“实体对象”。类似于打印机
可以打印一篇文章,但不能打印“写文章”这件工作。
【 在 pseudo 的大作中提到: 】
: 这个解释跟你理解的不是一个东西,上面很多版友已经解释了。你这个例子只用到了yield的一部分,还有一种很骚的语法你还没碰到,yield不仅右边有东西,左边也有东西,形如args = yield expr,你理解的只是expr的值,不是yield expr的值,yield expr作为一个整体还有一个值,pr
: int(expr)和print(yield expr)就不一样。
: docs写得很严谨,里面的定义不可望文生义。首先明确yield expr是一个表达式,本身是有值的,但不是expr的值。case=fab(3),执行完这句后,fab还没有执行里面的函数体;必须拿鞭子抽它一下,就是运行next(case),程序run起来后执行到yield时,卡死在那里,控制流程转移到外面
: ...................
--
FROM 118.212.215.*