почему доходность не возвращается 11? - PullRequest
0 голосов
/ 17 января 2019

Я не могу понять, почему мой генератор не возвращает значение = 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

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Потому что в любом случае вы увеличиваете значение!

Добавьте блок "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
0 голосов
/ 17 января 2019

Давайте проследим операцию чуть более внимательно:

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 означает, что вы не получите и 5 и 11 на последовательных итерациях.

...