Есть ли способ обновить условие цикла генератора, когда это значение не получено? - PullRequest
2 голосов
/ 27 октября 2019

Я пытаюсь создать счетчик с генератором, однако я также хочу иметь возможность отправлять () и обновлять входные данные генератора (хотя не обязательно давать этот вход).

def numberGenerator(n):
 number = 0
 while number < n:
     yield number
     number += 1

Я хочу иметь возможность сделать g = numberGenerator (5) -> next (g), 0 -> next (g), 1 -> g.send (10), чтобы обновить значениеn, так что генератор не остановится, когда он выдаст 4, но продолжит выводить до 9. Как бы я поступил так, сохраняя при этом счетчик «номер»?

Я тоже очень запуталсяо том, когда я ввожу g.send (10), потому что он выводит 2. Насколько я понимаю, я думаю, что значение send отправляется в строку номера выхода, а затем выполняется код ниже. Разве он не должен возвращать 11 на основе приведенного выше кода?

Я подумал о том, чтобы попробовать другой выход, чтобы мы могли на самом деле отправить значение n, но я не слишком уверен, как это будет взаимодействовать с next) и я не обязательно хочу сохранить значение n.

1 Ответ

2 голосов
/ 27 октября 2019

Генератор всегда работает до следующего yield (или до конца) - независимо от того, запущен ли send или next.

Посмотрите на модифицированный код ниже. newn - это значение, которое вы отправили генератору. Если вы не укажете это, это None. Таким образом, вы можете различить установку значения и получение.

def numberGenerator(n):
    number = 0 
    while number < n:
        newn = yield number
        if newn is None:
            number += 1
        else:
            n = newn
...