Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
Раньше я был фронтенд-аспирантом с большим трудом, думая, что избавился от js, а в результате еще и генератор итераторов в питоне, что возмутительно.
итератор
Обычно мы используем цикл for очень гладко и просто, верно? Например
Каков принцип?
for
оператор будет вызываться для объекта-контейнераiter()
. Функция возвращает определенное__next__()
Объект итератора для методов, которые будут обращаться к элементам в контейнере один за другим. Когда элемент истощается,__next__()
вызоветStopIteration
Исключение для уведомления о прекращенииfor
петля. ты можешь использоватьnext()
встроенная функция для вызова__next__()
метод.
Ниже мы видим, что итератор использует список для генерации итератора, и каждый вызов next будет принимать элемент в a.
Когда вы напишете дальше больше, чем количество элементов, произойдет аварийная остановка StopIteration.
Строитель
Функция с доходностью — это генератор, отличный от обычных функций,Генерирует генератор, который выглядит как вызов функции, но код функции не выполняется до тех пор, пока для него не будет вызван метод next() (next() вызывается автоматически в цикле for).
Потому что кто-то вроде меня, который не изучал python и начал читать код напрямую, сегодня столкнулся с генератором.
Подставил под индексы целый print(indices), а потом прилично вызвал функцию data_iter(...) В итоге, как ни запускаю, ни отлаживаю, не могу распечатать индексы, пока не увижу выходишь и чувствуешь, что что-то не так...
Хотя поток выполнения по-прежнему выполняется в соответствии с потоком функции, он будет прерываться каждый раз, когда выполняется оператор yield, и будет возвращено значение итерации, а выполнение продолжится со следующего оператора yield в следующем выполнении. . Это выглядит так, как будто функция прерывается по yield несколько раз во время нормального выполнения, и каждое прерывание возвращает текущее значение итерации через yield.
Преимущества yield очевидны.Переписывание функции в генератор дает ей возможность выполнять итерацию.По сравнению с использованием экземпляра класса для сохранения состояния для вычисления значения next next(), не только код лаконичнее, но и процесс исполнения очень ясен.
Когда выполнение функции завершается, генератор автоматически выдает исключение StopIteration, указывающее, что итерация завершена. В цикле for нет необходимости обрабатывать исключение StopIteration, цикл завершится нормально.
То же, что вызов функции, но создание генератора:
Роль yield такая же, как и return, используя next для вызова генератора, генератор выдает возвращаемое значение для остановки выполнения каждый раз, когда он выполняется для yield, и продолжает выполнение с места, где остановился последний yield, пока итеративный объект не использует After выдает ненормальное завершение StopIteration.
Добавьте два маленьких знания
-
Как определить, является ли функция генератором? Если с глазами проблем нет, то должен быть виден урожай. Если вы хотите найти метод высокого уровня, вы можете использовать:
from inspect import isgeneratorfunction isgeneratorfunction(函数名)
Возвращает true, если это генератор
-
yield похож на return, может ли быть return в генераторе?
В функции-генераторе, если нет возврата, она будет выполняться до тех пор, пока функция не завершится по умолчанию. Если она возвращается во время выполнения, она напрямую вызывает StopIteration для завершения итерации.