Deutsch
Telegram

ThreadПример из изучаемой мною книжки

4 Nachrichten · –
I
Пример из изучаемой мною книжки 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 просто какое-то, ничему не присвоенное выражение?
  1. A
    советую почитать про то что такое рекурсия
  2. C
    сумма а+b присаивается к b. a,b = (a=>b), (b=>a+b)
    1. 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. Всё так? Пока что это нужно разобрать. Запусти ещё код у себя, чтобы видеть всё.
ССообщество Python ПрограммистовСообщество Python Программистов@python_scripts · Gruppe · Technik
4 169Mitglieder43schreiben in 30 Tagen
Community-Feed In Telegram öffnen

Ein offener öffentlicher Feed aus dem Suchindex ChatCrawler — „Google für das öffentliche Telegram“; wird aktualisiert, während die Community gecrawlt wird. Zeiten in UTC.

Nur öffentliche Inhalte, offizielle Telegram-API. Über uns · FAQ · Grenzen des Index · Seite entfernen · Katalog · Suche · So zählen wir