Меню

Range python это генератор

Генераторы в Python и их отличие от списков и функций

В этом уроке мы с вами разберем, что из себя представляют генераторы в программировании на языке Python. Кроме того, мы обсудим генераторные выражения и разницу между списками и генераторами, а также между функциями и генераторами.

1. Что такое генератор в Python?

Генератор это подвид итерируемых объектов, как список или кортеж. Он генерирует для нас последовательность значений, которую мы можем перебрать. Эту последовательность можно использовать для итерации в цикле for, но нельзя проиндексировать (т. е., перебрать ее можно только один раз). Давайте посмотрим, как создается такая последовательность значений при помощи генератора.

а. Синтаксис генератора в Python 3

Для создания генератора в Python внутри функции вместо ключевого слова return используется ключевое слово yield. Обратите внимание на пример:

В этом примере мы определили генератор с именем counter() и назначили значение 1 локальной переменной i. Цикл while будет выполняться, пока i меньше или равно 10. Внутри цикла мы возвращаем (yield) значение i и увеличиваем его на единицу.

Затем мы используем этот генератор в цикле for.

b. Как работает генератор в Python

Чтобы разобраться в том, как работает этот код, давайте начнем с цикла for. Этот цикл выводит каждый элемент генератора (т. е., каждый элемент, возвращаемый генератором).

Мы начинаем с i=1. Таким образом, первый элемент, возвращаемый генератором, это 1. Цикл for выводит этот элемент на экран благодаря ключевому слову print. Затем i инкрементируется до 2. Весь процесс повторяется, пока i не инкрементируется до 11 (т. е., пока условие в цикле while не даст false).

Но если вы забудете добавить инкремент i, вы получите бесконечный генератор. Дело в том, что генератору в каждый момент времени нужно удерживать в памяти только одно значение. Таким образом, нет никаких ограничений памяти.

Even
Even
Even
Even
Even
Even
Even
Even
Even
Even
Even
Even
Even

EvenTraceback (самый недавний вызов идет последним):

Поскольку 2 это четное число, 2%2 это всегда 0. Поэтому условие в цикле while всегда будет соблюдаться (всегда true). В результате генератор even() продолжает возвращать значение Even, пока мы не прервем выполнение цикла вручную (сочетанием клавиш Ctrl+C).

Обратите внимание, что генератор может содержать больше одного ключевого слова yield. Примерно так же, как функция может иметь больше одного ключевого слова return.

2. Возврат значений в список

Здесь все просто. Если вы примените функцию list() к вызову генератора, она вернет список возвращенных генератором значений, в том порядке, в котором они возвращались. В следующем примере генератор возвращает квадраты чисел, если эти квадраты четные.

Чтобы создать список из возвращаемых генератором значений, мы просто применяем функцию list() к вызову генератора. Мы не перебираем эти значения при помощи цикла for.

Как видите, для чисел в диапазоне 0-9 (не 10, потому что диапазон (10) это числа 0-9), четные квадраты это 0, 4, 16, 36 и 64. Остальные — 1, 9, 25, 49, 81 — нечетные. Поэтому они не возвращаются генератором.

3. Разница между списком и генератором в Python

Разница между ними очень проста. Список сразу удерживает в памяти определенное число значений. А генератор в каждый отдельный момент удерживает только одно значение — то, которое он возвращает. Вот почему генераторы требуют куда меньше памяти. Когда мы применяем генератор, нам также не приходится ждать рендеринга всех значений.

4. Разница между генератором и функцией в Python

Чтобы разобраться в различиях между генераторами и функциями, давайте сначала разберем разницу между ключевыми словами return и yield.

Когда интерпретатор доходит до ключевого слова return, выполнение функции полностью прекращается. Но когда он доходит до ключевого слова yield, программа приостанавливает выполнение функции и возвращает значение в итерируемый объект. После этого интерпретатор возвращается к генератору, чтобы повторить процесс для нового значения.

Читайте также:  Коэффициент полезного действия генератора постоянного тока

Кроме того, при прекращении выполнения функции ее локальные переменные стираются. В генераторах ситуация другая. Взгляните:

5. Генераторные выражения в Python

Для создания генераторов на скорую руку можно использовать выражения (как и для генераторов списка). Давайте возьмем для этого список:

at 0x003CC330>

Как видим, мы получили генератор. Но чтобы получить доступ к значениям, нужно сохранить его в переменной, а затем применить к этой переменной функцию next().

Traceback (самый недавний вызов идет последним):

Вот и все, что мы хотели рассказать вам о генераторах в Python. Надеемся, вам понравилось наше объяснение.

6. Заключение

Теперь, когда вы знаете о преимуществах генераторов по сравнению со списками и функциями, вы понимание их важность. Что-то мы можем делать при помощи генератора, что-то — при помощи функции или даже генератора списка. Но использование генераторов наиболее эффективно.

Источник

Генератор списка

Генераторы списка в языке программирования Python являются мощным инструментом по работе с разноплановыми совокупностями данных. Чаще всего эти конструкции используются для более удобного взаимодействия со списками, обеспечивая не только их создание, но и модификацию. Несмотря на то, что в некоторых случаях без генераторов можно обойтись, их грамотное применение значительно упрощает реализацию сложных алгоритмов.

Простая генерация

Самым простым способом создания списка является обычное присваивание ему необходимых значений или объектов. В том случае, когда элементов последовательности немного, их можно просто перечислить один за другим. Но если их количество переваливает за десяток, следует всерьез задуматься об использовании генератора списка. Данная конструкция обеспечивает его автоматическое заполнение, исходя из определенных инструкций.

Следующий пример демонстрирует создание в Python списка чисел при помощи генератора. Переменная i является ссылкой на текущий элемент объекта data. Функция range здесь принимает два аргумента, которые устанавливают границы для сгенерированной последовательности целых чисел. Вывод информации на экран происходит через метод print.

Генераторы списка Python 3 работают не только с численными значениями. Как показывает следующий пример, генератору можно передать в качестве аргумента строку либо ссылку на нее.

В результате выполнения этого кода будет построен список из символов, которые включала в себя исходная строка. Как и в случае с предыдущим примером, вывести полученный набор данных на экран можно при помощи уже известного метода print.

Генератор с условием

Один из часто используемых способов генерации списков в Python — с условием. Предыдущие примеры демонстрировали довольно тривиальный подход к заполнению списка при помощи генератора. Данные конструкции языка Python позволяют задавать определенные условия для выполнения такой операции. Например, существует задача перенести в список только четные числовые значения из созданной ранее выборки range.

В дело вступает команда if, после которой следует небольшая инструкция, сообщающая о том, что каждый элемент последовательности должен выполнять некоторое условие. В данном случае необходимо возвращать 0 в результате вычисления остатка от целочисленного деления. Как можно увидеть, прошедшие проверку цифры были занесены в список.

Генератор с циклом

В языке Python также существует возможность генерировать список при помощи нескольких циклов, помещая их в квадратные скобки инициализации. В следующем примере используется две конструкции for, осуществляющие поочередный перебор значений для переменных i и j. Числовой диапазон для них (от 0 до 3), как и раньше, задается через методы range.

Результатом выполнения данного кода станет создание списка data на основе поочередного перемножения переменных i и j. Благодаря циклам for, их значения увеличиваются пошагово. Таким образом, генерируется список из девяти элементов.

Генерация вложенных списков

Иногда у программиста возникает необходимость в использовании списков с более чем одним измерением. К примеру, многомерные наборы данных могут понадобиться в случае работы с математическими матрицами. Для этого в Python можно также применять генераторы, просто помещая цикл для создания одного списка внутрь другого. Ограничениями области действия для вложенного списка станут квадратные скобки, как показано в следующем примере.

Читайте также:  Замыкание в цепи обмотки возбуждения генератора

Данный код демонстрирует создание двумерной матрицы с размерностью 3×3 при помощи генератора двумерного списка Python. Элементами этой числовой последовательности стали цифровые значения из методов range, как и в предыдущих примерах. Переменные i и j пошагово увеличиваются в циклах на единицу и перемножаются между собой. Функция print служит для визуального отображения сгенерированного набора данных на экран компьютера.

Достаточно часто при создании вложенного списка Python используется генератор матрицы нулей. В качестве примера создадим матрице 3×2:

Генератор списка с lambda

Как известно, лямбда-функции в Python представляют собой некую операцию, возвращающую значение. Преимуществом данного механизма является возможность его применения внутри выражения. Это позволяет значительно уменьшить объем набираемого программистом кода, поскольку в таком случае нет необходимости отдельно объявлять новый метод. Генератор списка с lambda в Python позволяет

Иногда используются в Python lambda-функции в генераторе списков. В следующем примере будет создана новая последовательность чисел, полученных в результате выполнения метода range. Как и раньше, элемент этого набора представляется в виде переменной i, которая пошагово получает новые значения (от 0 до 9) в цикле for. Лямбда-функция принимает в качестве аргумента значение, затем перемножает его само на себя и возвращает обратно в генератор.

Таким образом, создается список data, содержащий результаты возведения в квадрат для чисел от 0 до 9. Как обычно, функция print выводит информацию на экран.

Применение itertools

Для выполнения продвинутой генерации списка в языке Python используется подключаемая библиотека под названием itertools. С ее помощью можно создавать наборы значений по определенным правилам. Чтобы активировать функции данного модуля, следует внести в начало программного файла следующую инструкцию.

Методы, которые содержит эта библиотека, позволяют генерировать списки с использованием улучшенных циклов. Например, с ее помощью можно легко создавать комбинации различных значений, как символьных, так и числовых. Следующий код является простым примером генерации списка с вызовом функции repeat.

Как видно из полученного результата, метод возвращает последовательность одинаковых объектов (в данном случае это число 1), повторяющихся 5 раз.

Заключение

Продвинутые функциональные возможности, представленные в языке Python генераторами списков, позволяют программисту повысить скорость и эффективность обработки данных. Рассмотренный механизм включает в себя создание как обычных, так и многомерных списков на основе определенных условий, а также с использованием циклов. Также в языке имеется возможность генерации при помощи lambda-выражений и с использованием библиотеки intertools.

Источник

Генераторы и итераторы в Python

Генератор в Python – одна из самых полезных и специальных функций. Мы можем превратить функцию в итератор, используя генераторы Python.

Базовая структура генератора

По сути, генератор в Python – это функция. Вы можете рассматривать следующее, как базовую структуру генератора.

В приведенной выше структуре вы можете видеть, что все похоже на функцию, за исключением одного ключевого слова yield. Это ключевое слово играет жизненно важную роль. Только использование yield превращает обычную функцию в генератор.

Обычная функция возвращает какое-то значение, генератор возвращает какое-то значение и автоматически реализует next() и _iter_.

Генератор написан как обычные функции, но использует оператор yield всякий раз, когда они хотят вернуть какие-то данные. Каждый раз, когда функция next() вызывается для функции генератора, он возобновляет работу с того места, где он остановился (он запоминает все значения данных и какой оператор был выполнен последним).

Давайте теперь изучим каждую строку предыдущего кода:

  • Строка 2 – это объявление генератора, принимающего аргумент. Это необязательный аргумент, все зависит от программиста, который будет реализовывать генератор.
  • Строка 3, 5 – упоминает, что могут быть и другие утверждения.
  • Строка 4 – является важной частью вышеуказанной программы. Он говорит, что значение аргумента должно быть получено на основе некоторых условий, которые могут быть указаны в утверждениях.
  • Строка 8 – вызывает генератор с параметром 10, а строка 9 печатает возвращенный объект генератора.

Если вы запустите указанную выше программу, она выдаст следующее:

Читайте также:  Ремонт генераторов toyota corolla

Обратите внимание, что приведенный выше результат не является значением. Фактически это указывает, где находится объект. Чтобы получить реальное значение, воспользуйтесь итератором. Затем next() будет вызываться для объекта, чтобы получить следующее полученное значение.

Если вы хотите распечатать сгенерированные значения без цикла, вы можете использовать для него функцию next(). Если вы добавите еще одну строку в приведенный выше код, как показано ниже.

Затем он выведет значение 10, которое было передано в качестве аргумента и получено.

Получить значение генератора с точным вызовом next()

Теперь взгляните на следующую программу, в которой мы вызываем функцию next() генератора.

В приведенном выше коде вы должны знать точное количество полученных значений. В противном случае вы получите некоторую ошибку, так как функция генератора fruits() больше не генерирует значения.

Приведенный выше код будет выводиться следующим образом:

Получение значения генератора с косвенным вызовом next()

Вы можете получить значения генератора, используя цикл for. Следующая программа показывает, как можно распечатать значения с помощью цикла for и генератора. Это даст тот же результат.

Порядок работы

Давайте теперь посмотрим, как на самом деле работает генератор. Обычная функция завершается после оператора return, а генератор – нет.

В первый раз мы вызываем функцию, она возвращает первое значение, полученное вместе с итератором. В следующий раз, когда мы вызываем генератор, он возобновляет работу с того места, где он был приостановлен ранее.

Все значения не возвращаются одновременно из генератора, в отличие от нормальной функции. Это специальность генератора. Он генерирует значения, вызывая функцию снова и снова, что требует меньше памяти, когда мы генерируем огромное количество значений.

Вывод программы

Помните, что range() – это встроенный генератор, который генерирует число в пределах верхней границы.

Итератор – это объект, который используется для итерации по итерируемому элементу.

Большинство объектов в Python являются итеративными. Все последовательности, такие как Python String, Python List, Python Dictionary и т.д., являются повторяемыми. Что такое итератор? Предположим, группа из 5 мальчиков выстроилась в линию. Вы указываете на первого мальчика и спрашиваете его, как его зовут. Затем он ответил. После этого вы спрашиваете следующего мальчика и так далее. Изображение ниже иллюстрирует это.

В этом случае вы Итератор. Очевидно, группа мальчиков – повторяющийся элемент.

Протокол Iterator

Протокол Iterator в Python включает две функции. Один – iter(), другой – next(). В этом разделе мы узнаем, как пройти по итерируемому элементу, используя протокол Iterator.

В предыдущем разделе мы привели пример группы из 5 мальчиков и вас. Вы итератор, а группа мальчиков – повторяемый элемент. Зная имя одного мальчика, вы задаете тот же вопрос следующему мальчику.

После этого вы делаете это снова. Функция iter() используется для создания итератора повторяемого элемента. А функция next() используется для перехода к следующему элементу.

Пример

Если итератор превысит количество повторяемых элементов, метод next() вызовет исключение StopIteration. Смотрите код ниже для примера:

Создание

Однако вы можете создать свои собственные указанные итераторы в Python. Для этого вам необходимо реализовать класс.

Как мы уже говорили ранее, протокол состоит из двух методов. Итак, нам нужно реализовать этот метод.

Например, вы хотите создать список чисел Фибоначчи, чтобы каждый раз при вызове следующей функции он возвращал вам следующее число.

Чтобы вызвать исключение, мы ограничиваем значение n ниже 10. Если значение n достигнет 10, это вызовет исключение. Код будет таким:

Зачем нужен итератор?

После прохождения предыдущего раздела у вас может возникнуть вопрос, зачем нам нужен Iterator.

Что ж, мы уже видели, что итератор может проходить по итерируемому элементу. Предположим, что в нашем предыдущем примере, если мы составим список чисел Фибоначчи, а затем проходим его через Iterator, это потребует огромной памяти. Но если вы создадите простой класс, вы сможете выполнить свою задачу, не потребляя столько памяти.

Источник

Adblock
detector