python的send疑惑
本帖最后由 AlexAux 于 2020-8-18 23:52 编辑def a():
print('aaa')
p1 = yield '123'
print('bbb')
if (p1 == 'hello'):
print('p1是send传过来的')
p2= yield '234'
print(p2)
r = a()
next(r)
r.send('hello')
#结果为
aaa
bbb
p1是send传过来的
但让我没学会的是,为什么要在后面加个p2,我尝试去掉p2以及后面的print,但显示会报错
所以为什么需要加这个p2,我用断点看了一下, p2和print(p2)运行了,但是这个print没有打印,因为前面有yield,但是前面的if判断完,是hello的话,然后打印输出后。下面的p2应该可以省略的啊,为什么还要加个p2=yield才不会报错 本帖最后由 fanvalen 于 2020-8-18 14:12 编辑
我看错了,估计是饿昏了
next(r) 第一次是执行到了 p1 = yield '123' 所以这次迭代执行了 print('aaa')
p1 = yield '123'因为有yield的存在 这个函数相当于 return了 p1= '123'后就停止迭代了。当r.send('hello')的时候,类似于强制把 yield "return"的 p1= '123' 改成了 p1 = "hello",这样函数a继续从 print('bbb') 开始往下执行,因为p1此时= "hello"所以符合 if (p1 == 'hello'): 然后就 执行 print('p1是send传过来的')。此时函数a执行到了 p2 = yield '234' 就return了p2 但是print(p2)就没执行了。你可以去掉 print(p2) 但是去掉 p2 = yield '234' 就会提示 StopIteration了。
因 前面说的比较乱,p2=yield 相当于 第二次的迭代结束的地方,你第一次 next(r) 到 p1 = yield '123' 有yield,后续没有 yield的话 你 next 和 send都会报StopIteration fanvalen 发表于 2020-8-18 13:38
你的def a()括号里没写参数怎么传 你以为是变量哦直接用,
要写成def a(p1)
send可以把 yield 返回的变量直接重新赋值 可以理解成,yield的执行次数大于1 本帖最后由 pzx521521 于 2020-8-18 14:54 编辑
3L 正解
简单来说就是, 删掉p2后, 这个生成器a就一个值(一个yield), 而你取了2次 next一次 send一次
可以这样改:
def a():
while True:
print('aaa')
p1 = yield '123'
print('bbb')
if (p1 == 'hello'):
print('p1是send传过来的')
r = a()
print(next(r))
r.send('hello') 不懂的话,看这个
python中yield的用法详解——最简单,最清晰的解释_mieleizhi0522的博客-CSDN博客_yield
https://blog.csdn.net/mieleizhi0522/article/details/82142856/ pzx521521 发表于 2020-8-18 14:51
3L 正解
简单来说就是, 删掉p2后, 这个生成器a就一个值(一个yield), 而你取了2次 next一次 send一次
可 ...
表哥是不是可以理解为send也可以看作是一次next 本帖最后由 AlexAux 于 2020-8-18 22:49 编辑
pzx521521 发表于 2020-8-18 14:51
3L 正解
简单来说就是, 删掉p2后, 这个生成器a就一个值(一个yield), 而你取了2次 next一次 send一次
可 ...
表哥我悟了
页:
[1]