AlexAux 发表于 2020-8-18 12:34

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 13:38

本帖最后由 fanvalen 于 2020-8-18 14:12 编辑

我看错了,估计是饿昏了

wdxm2008 发表于 2020-8-18 13:46

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了。

wdxm2008 发表于 2020-8-18 13:47

前面说的比较乱,p2=yield 相当于 第二次的迭代结束的地方,你第一次 next(r) 到   p1 = yield '123' 有yield,后续没有 yield的话 你 next 和 send都会报StopIteration

wdxm2008 发表于 2020-8-18 13:51

fanvalen 发表于 2020-8-18 13:38
你的def a()括号里没写参数怎么传 你以为是变量哦直接用,
要写成def a(p1)



send可以把 yield 返回的变量直接重新赋值

jandyx 发表于 2020-8-18 14:07

可以理解成,yield的执行次数大于1

pzx521521 发表于 2020-8-18 14:51

本帖最后由 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')

我心飞翔1995 发表于 2020-8-18 15:20

不懂的话,看这个
python中yield的用法详解——最简单,最清晰的解释_mieleizhi0522的博客-CSDN博客_yield
https://blog.csdn.net/mieleizhi0522/article/details/82142856/

AlexAux 发表于 2020-8-18 21:22

pzx521521 发表于 2020-8-18 14:51
3L 正解
简单来说就是, 删掉p2后, 这个生成器a就一个值(一个yield), 而你取了2次 next一次 send一次
可 ...

表哥是不是可以理解为send也可以看作是一次next

AlexAux 发表于 2020-8-18 22:27

本帖最后由 AlexAux 于 2020-8-18 22:49 编辑

pzx521521 发表于 2020-8-18 14:51
3L 正解
简单来说就是, 删掉p2后, 这个生成器a就一个值(一个yield), 而你取了2次 next一次 send一次
可 ...
表哥我悟了
页: [1]
查看完整版本: python的send疑惑