Проблема с итерацией функций генератора - PullRequest
1 голос
/ 28 апреля 2020

Допустим, у нас есть эта функция генератора:

def count_up_to(max):
    count = 1
    while count <= max:
        yield count
        count += 1

Теперь, если я хочу вызвать функцию next(), мне нужно будет присвоить функцию count_up_to переменной, иначе вывод будет всегда быть "1".

Код ниже работает отлично и перебирает числа:

counter = count_up_to(10)
print(next(counter))
print(next(counter))
print(next(counter))
.
.
.

Но этот не работает и продолжает печатать "1".

print(next(count_up_to(10)))
print(next(count_up_to(10)))
print(next(count_up_to(10)))
.
.
.

Но почему? print(next(counter)) отличается от print(next(count_up_to(10)))?!

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

В вашем последнем фрагменте вы всегда создаете новый генератор, поэтому он всегда печатает «1».

Во втором вы назначаете генератор, возвращаемый count_up_to, переменной count, а не функции , И с каждым вызовом next (count) вы говорите генератору выдавать следующее значение.

Я надеюсь, что это поможет :)

2 голосов
/ 28 апреля 2020

Это вполне ожидаемое поведение. Позвольте мне описать, почему.

Каждый отдельный вызов count_up_to возвращает вам новый генератор, который начинается с 1.

Простая проверка Python REPL:

>>> count_up_to(100)
<generator object count_up_to at 0x10e28beb0>
>>> count_up_to(100)
<generator object count_up_to at 0x10e28bf00>
>>> count_up_to(100)
<generator object count_up_to at 0x10e28beb0>
>>> count_up_to(100)
<generator object count_up_to at 0x10e28bf00>

Посмотрите на адрес. Он всегда разный, в памяти 4 разных генератора.

Итак, функция count_up_to не является генератором сама по себе, но она возвращает генератор при вызове.

И когда вы сохраняете результат из count_up_ для вызова переменной, вы храните генератор Далее вы можете получить значения из генератора, хранящиеся в переменной.

...