为什么收益率不返回11?

2024-09-25 08:25:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白为什么我的生成器没有返回值=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


Tags: 代码nonetrueforifisdefnot
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。你知道吗

因为在任何情况下你都会增加价值!你知道吗

添加“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

相关问题 更多 >