Далее она выполняет построчную итерацию в файле с помощью цикла for. Базовый вариант предполагает, что функция возвращает все строки одновременно. Из-за этого функция возвращает только одну строку за раз (без символа новой строки в конце).
При следующем вызове next() функция продолжает выполнение с точки последней приостановки. Вне зависимости от того, как значение local_i будет меняться при вызовах MoveNext, поле param_i остаётся неизменным. Как мы видели ранее, значение этого поля записывается в поле local_i объекта, возвращаемого при вызове GetEnumerator. При втором вызове GetEnumerator мы получим новый объект, в котором значение поля local_SomeString будет задано корректно.

Это может негативно сказаться на производительности приложения. Если https://www.xcritical.com/ вы знакомы с LINQ, то подобное поведение, возможно, не будет казаться чем-то необычным, ведь работа с результатами LINQ-запросов строится аналогичным образом. Однако менее опытных разработчиков такие чудеса могут поставить в тупик. Если у возвращённого методом GetNumbers генератора вызывать MoveNext, то сначала дважды будет выводиться “moveNext”, а затем – “anotherStr”. Если вызвать метод GetInts ещё раз, то будет возвращён новый объект, который позволит вновь выполнить генерацию элементов. Нетрудно догадаться, что если вызвать MoveNext ещё раз, то выполнение метода вновь продолжится с того момента, где ранее было приостановлено.

Когда генератор снова запрашивается (например, в следующей итерации цикла), выполнение продолжается с места, следующего за последним yield. Вот еще один, немного более сложный пример использования yield. Здесь он нам понадобится для многозадачной обработки данных без использования потоков или асинхронного программирования.
Полученный в результате эквивалент годовой прибыли нужно прибавить к текущему доходу, чтобы определить величину дохода при погашении ценной бумаги. Если текущая цена выше установленной цены при погашении, потенциальный годовой убыток при наступлении срока погашения необходимо вычесть из текущего дохода. Такой расчет подходит для ценных бумаг, подлежащих погашению через определенный срок (см. Redeemable monetary что такое пул ликвидности security). Генераторы облегчают выполнение задач, связанных с управлением данными, сложными структурами и бесконечными последовательностями. В следующем разделе мы обсудим дополнительные возможности, которые открывают генераторы.

Они начинают генерировать последовательности, используя значения параметров, которые были переданы при вызове yield-метода. Достигается это благодаря хранению исходного значения параметра в дополнительном поле. Возвращаемый тип метода GetFibonacci – IEnumerable, следовательно, доступ к методу MoveNext отсутствует.
Ключевое слово yield является мощным инструментом в Python, позволяющим функциям возвращать значения по мере их генерации, а не формировать весь результат сразу. Это своего рода особый тип оператора return, который «приостанавливает» выполнение функции до следующего вызова, сохраняя её текущее состояние. Когда функция с yield вызывается, она не выполняет код немедленно — вместо этого создается объект-генератор.
Если вывести в консоль содержимое, можно лучше понять, что происходит внутри. Чтобы создать функцию-генератор, нужно добавить знак звёздочки между ключевым словом perform и названием функции. Я расскажу тебе про yield – статический метод класса Thread. Как видно из результатов, реализация Array на порядок быстрее и потребляет в 4 раза меньше памяти.
Это быстрый способ обхода сгруппированных значений, хотя существует небольшая опасность превращения цикла в бесконечный. Снижается нагрузка на память и повышается эффективность работы. Понимание того, как работают генераторы, поможет вам лучше осознать, как использовать ключевое слово yield для создания итераторов и управления yield памятью в ваших приложениях.