【问题标题】:why is yield not returning 11?为什么产量不返回 11?
【发布时间】:2019-06-12 00:08:08
【问题描述】:

我无法弄清楚为什么我的生成器没有返回值 =11,这是我的代码:

    def monG(borneinf,bornesup):
        while True:
            if bornesup < borneinf:
                 bornesup, borneinf = borneinf, bornesup
            borneinf += 1
            if borneinf==bornesup:
                 break
            x=(yield borneinf)
            if x is not None:
               borneinf = x

     c=monG(2,10)
     for a in c:
        if a==5:
            c.send(20)
        print(a)

输出:

3
4
5
12
13
14
15
16
17
18
19

【问题讨论】:

  • 对于其他没有遇到这种奇怪的x = yield ..gen.send(20)的东西:realated questions regarding generator.send()
  • 你正在丢弃 c.send(20) 的结果,即 11。
  • 当你得到解决方案时,请记得给有用的东西投票并接受你最喜欢的答案(即使你必须自己写),这样 Stack Overflow 才能正确存档问题。我认为您这样做也会获得一些声誉积分。
  • 我该怎么做?它说我没有足够的声望点,对不起,我是新来的。

标签: python python-3.x generator coroutine


【解决方案1】:

因为无论如何你都会增加价值!

添加“else”块:

像这样:

def monG(borneinf,bornesup):
    while True:
        if bornesup < borneinf:
            bornesup, borneinf = borneinf, bornesup

        if borneinf==bornesup:
            break

        x=(yield borneinf)
        if x is not None:
            borneinf = x
        else:
            borneinf += 1

c=monG(2,10)
for a in c:
    if a==5:
        c.send(20)
    print(a)

输出:

2
3
4
5
11
12
13
14
15
16
17
18
19

【讨论】:

    【解决方案2】:

    让我们更仔细地跟踪操作:

    def monG(borneinf,bornesup):
        while True:
            if bornesup < borneinf:
                bornesup, borneinf = borneinf, bornesup
            borneinf += 1
            if borneinf==bornesup:
                break
    
            print("TRACE", borneinf, bornesup)
            x=(yield borneinf)
            if x is not None:
                borneinf = x
    
    c = monG(2,10)
    print(type(c))
    for a in c:
        if a==5:
            print(c.send(20), "a==5")
        print(a)
    

    这在c.send 行上为我们提供了一个特殊标签,以及在yield 之前的一瞥

    输出:

    <class 'generator'>
    TRACE 3 10
    3
    TRACE 4 10
    4
    TRACE 5 10
    TRACE 11 20
    11 a==5
    5
    TRACE 12 20
    12
    TRACE 13 20
    13
    TRACE 14 20
    14
    TRACE 15 20
    15
    TRACE 16 20
    16
    TRACE 17 20
    17
    TRACE 18 20
    18
    TRACE 19 20
    19
    

    正如MisterMiyagi 指出的那样,yield 确实返回 11,但你把它扔掉了。也许您想将该值分配给a——尽管弄乱循环参数是一种明确的代码气味。如果您进行该分配,则在该迭代中打印出11 而不是5

    我认为您的基本问题是您干扰了迭代流程,从而在循环内强制增加了一个 yield。在您编码的循环中,隐含的yield 意味着您在连续迭代中不会同时获得511

    【讨论】:

    • 感谢您的澄清,我知道现在出了什么问题,我实际上不知道我可以在 c.send(20) 中捕获结果。我应该更多地了解生成器方法
    • 我知道那种感觉;我刚刚做了一些研究,所以我可以回答你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多