吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 921|回复: 9
收起左侧

[已解决] python的send疑惑

[复制链接]
AlexAux 发表于 2020-8-18 12:34
本帖最后由 AlexAux 于 2020-8-18 23:52 编辑

[Python] 纯文本查看 复制代码
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,但显示会报错
2020-08-18_12-28-52.png

所以为什么需要加这个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一次
可以这样改:
[Asm] 纯文本查看 复制代码
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一次
可 ...

表哥我悟了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 13:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表