Пример из изучаемой мною книжки
def fibonacci_generator():
a = b = 1
while True:
yield a
a, b = b, a + b
print(a, b) #поможет лучше понять работу
fib = fibonacci_generator()
for i in fib:
if i > 100:
break
else:
print('Generated:', i)
Что в данном коде выполняет функция yield? В книге написано - "Она [генераторная инструкция], начинается с ключевого слова yield и определяет объект-генератор (то есть переменную a?), который возвращается оператору (print?), вызвавшему функцию. Когда генераторная инструкция исполняется, состояние объекта генератора "замораживается" и сохраняется. Объект, возвращаемый генераторной инструкцией, может быть присвоен переменной (это мы сделали на 7 строке кода?)." Но я так и не понял, как это отражается в результате кода?
Я пытаюсь понять работу кода сопоставив код с результатом его выполнения. Вот несколько строк результата:
Generated: 1
1 2
Generated: 1
2 3
Generated: 2
3 5
Generated: 3
5 8
Generated: 5
8 13
...
Что после операций a, b = b, a + b становится содержимым функции fibonacci_generator? Результат суммы a и b? Переменная а на второй итерации равна 2, потому что "при этом она сохраняет состояние своего последнего вызова и при следующем вызове продолжает работу с той же точки."? Почему, к примеру, на первой итерации, вывод переменной b отображает 2, ведь сумма а + b просто какое-то, ничему не присвоенное выражение?
سلسلةПример из изучаемой мною книжки
4 رسائل · –A C I Спасибо! Я забыл это свойство, думал, просто a какое-то, зачем оно здесь, потом b = b. Теперь я понял. Я почти-почти уже начинаю понимать всё, теперь только осталось разобраться с yield. Я пытаюсь отладывать у себя в голове, но плохо получается. Примерно так размышляю: значит, a и b равны 1, далее строка yield a, тут мы, как сказанно, определили объект-генератор, заморозили и сохранили, не особо понимаю, что это значит. Ладно, из строки a, b = b, a+b заключаем, что, в начале, a = b, то есть a = 1, потом b = a+b, то есть b = 2. У нас и вывод соответствующий. Теперь, что выводится после слова Generated? В первой итерации выводится 1. Значит yield заморозил, сохранил значение переменной a, и функция fibonacci_generator стала содержать в себе значение этой переменной, которое потом присваивается переменной fib, потом итератором for присваивается переменной i, и, наконец, выводится функцией print. Всё так? Пока что это нужно разобрать. Запусти ещё код у себя, чтобы видеть всё.