Если делители есть, программа переходит к следующему числу. Если их нет, значит, n — число простое, и программа выводит его на печать. Они позволяют поочерёдно получать нужные веб-страницы и обрабатывать их информацию. Это намного эффективнее, чем загрузить в память сразу все выбранные страницы и затем обрабатывать их в цикле. Когда мы выведем на консоль переменную gen, то увидим лишь сообщение, что это объект-генератор.
В любом случае, не называйте генераторами списочные выражения, это – грубая ошибка. Заметьте, что вызов функции iterate вычислился в объект-генератор , сама же функция не зациклилась. Теперь iterate — это именно функция, ведь она вычисляет вполне конкретный результат. Подобным образом https://deveducation.com/ с помощью генераторов можно создавать ряды случайных чисел, комбинаторные структуры, рекуррентные ряды, например, ряд Фибоначчи и другие последовательности. Этим генераторы отличаются от списков — те хранят в памяти все свои элементы, и удалить их можно только программно.
Поэтому мы говорим “генератор списка”, понимая под словом “генератор” не объект, а синтаксическую конструкцию, которая генерирует, то есть создает, список. В первом случае вызывающая сторона получит сгенерированное значение, а выполнение вновь приостановится. Остальные два случая работают одинаково — они завершают процесс итерации.
Ключевое слово return — это финальная инструкция в функции. В примере ниже значения выводятся с помощью генератора. Python позволяет писать выражения генератора для создания анонимных функций генератора.
В прошлых примерах метод next() применялся по отношению к итератору, который возвращала функция генератора. Она является частью генератора и заменяет ключевое слово return. Когда программа доходит до yield, то функция переходит в состояние ожидания и продолжает работу с того же места при повторном вызове. Как вы могли заметить, интерпретатор действительно при каждой передаче нашего generator-object в функцию next выполнил код до ближайшего yield. При этом и в первом, и во втором вызове next мы работали с одним и тем же объектом. Очередное значение как бы «отстреливается», словно пуля из пистолета при нажатии на спуск.
Когда весь цикл пройден, произойдёт исключение StopIteration. Хотя на консоль сообщение об этом не выводится, но генератор помнит о нём и больше работать не будет. То есть цикл for можно запускать только один раз, во второй раз не получится. Принимает на вход итерируемый объект и возвращает пары (индекс элемента,
элемент).
Создает исключение в точке, где генератор был приостановлен, и возвращает следующее значение, выданное функцией генератора . Если генератор завершает работу, не выдав другого значения, то возникает исключение StopIteration. Если функция генератора не улавливает переданное исключение или создает другое исключение, то это исключение распространяется на вызывающую сторону/программу. Также можно использовать цикл for для итерации по объекту генератора. В этом случае вызов next() происходит неявно, но элементы все равно возвращаются один за одним.
Быстрым способом создания относительно простых объектов-генераторов являются генераторные выражения – generator expressions. Синтаксис этих выражений похож на синтаксис генераторов списков. В этом примере мы используем генераторное выражение для создания генератора квадратов генератор python чисел и затем итерируемся по нему с помощью цикла for. Запомните, что выражения создающие списки возвращают списки, в то время как выражения генераторов возвращают генераторы. Генераторы работают одинаково, независимо от того, построены они на основе функции или выражения.
При этом нужный для работы объём памяти не зависит от размера файла и количества строк, удовлетворяющих условию. Если необходима более сложная логика, то следует вернуться к использованию функций-генераторов. Для того, чтобы перейти к следующему состоянию, используется функция
next(). Это вполне приемлемое решение, но будет ли этот подход работать, если файл окажется слишком большим?
Ключевое слово yield применяется там, где значение нужно отправить обратно вызывающей стороне. Но в отличие от return, выхода из функции в данном случае не происходит. Вместо этого, при возврате состояние функции запоминается. Более того, когда next() вызывается для объекта-генератора (явно или неявно в цикле for), ранее полученная переменная num увеличивается, а затем возвращается снова.