Зачем мне сначала сохранять функцию генератора в переменной? - PullRequest
0 голосов
/ 01 февраля 2019

Я изучаю использование генераторов в python, но у меня возникла странная проблема.

Как может получиться, что следующий код работает должным образом (например, возвращает следующее число Фибоначчи при каждом вызове функции):

def fibonacci():                                       
    current, previous = 0,1                             
    while True:                                         
        yield current
        current, previous = current + previous, current

fib = fibonacci()

for i in range(0,21):
    print(next(fib))

Но когда я напрямую вызываю функцию внутри моего for-цикл, как таковой:

for i in range(0,21):
    print(next(fibonacci()))

Он печатает 21 ноль?

1 Ответ

0 голосов
/ 01 февраля 2019

Как сказал Крис в своем комментарии:

Потому что тогда вы создаете новый генераторный объект на каждой итерации, снова и снова получая первый элемент.

Вы может избегать присвоения его переменной, перебирая ее напрямую.Таким образом, вы создаете только один объект генератора:

for n, i in zip(fibonacci(), range(0,21)):
    print(n)
...