Что такое итераторы и генераторы

Python. Урок 15. Итераторы и генераторы

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

Итераторы в языке Python

Во многих современных языках программирования используют такие сущности как итераторы. Основное их назначение – это упрощение навигации по элементам объекта, который, как правило, представляет собой некоторую коллекцию (список, словарь и т.п.). Язык Python, в этом случае, не исключение и в нем тоже есть поддержка итераторов. Итератор представляет собой объект перечислитель, который для данного объекта выдает следующий элемент, либо бросает исключение, если элементов больше нет.

Приведем несколько примеров, которые помогут лучше понять эту концепцию. Для начала выведем элементы произвольного списка на экран.

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

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

Создание собственных итераторов

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

В нашем примере при четвертом вызове функции next() будет выброшено исключение StopIteration. Если мы хотим, чтобы с данным объектом можно было работать в цикле for, то в класс SimpleIterator нужно добавить метод __iter__(), который возвращает итератор, в данном случае этот метод должен возвращать self.

Генераторы

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

Данная функция будет работать точно также, как класс SimpleIterator из предыдущего примера.

Ключевым моментом для понимания работы генераторов является то, при вызове yield функция не прекращает свою работу, а “замораживается” до очередной итерации, запускаемой функцией next(). Если вы в своем генераторе, где-то используете ключевое слово return, то дойдя до этого места будет выброшено исключение StopIteration, а если после ключевого слова return поместить какую-либо информацию, то она будет добавлена к описанию StopIteration.

P.S.

Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. На нашем сайте вы можете найти вводные уроки по этой теме. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

Источник

Итераторы и выражения-генераторы

На этом занятии мы с вами поговорим об итераторах и выражениях-генераторах. С генераторами списков мы уже сталкивались, например, когда создавали список вот таким образом:

Выражения-генераторы очень похожи на генераторы списков и в синтаксисе отличаются только круглыми скобками:

Если мы теперь отобразим переменную b, то увидим:

что эта переменная ссылается на объект-генератор. Вообще,

Генератор – это итератор, элементы которого можно перебирать (итерировать) только один раз.

И в этом определении мы сталкиваемся с термином итератор:

Итератор – это объект, который поддерживает функцию next() для перехода к следующему элементу коллекции.

Наконец, последний термин, что нам пригодится, звучит так:

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

Теперь, давайте рассмотрим все на конкретных примерах. Самый распространенный итерируемый объект в Python – это список:

но мы не можем его обойти с помощью итератора, используя функцию next:

потому что список – это не итератор. Но мы любой итерируемый объект можем легко преобразовать в итератор с помощью функции iter:

На выходе образуется объект-итератор для списка. Сохраним его в переменной:

Теперь, элементы списка можно обойти с помощью этого итератора:

При первом ее вызове она возвратит первое значение списка a и изменит позицию итератора it, переместив его на следующий элемент. Поэтому при втором вызове:

мы получим уже значение второго элемента и так до конца списка:

Если вызвать функцию next когда мы уже дошли до конца списка, то она возвратит ошибку:

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

Теперь, возвращаясь к выражению-генератору:

переменную b можно воспринимать как итератор и перебирать список через функцию next:

возвратит первое значение. Повторный вызов:

возвратит второе значение и так до конца списка. Здесь также мы можем выполнить перебор всех значений только один раз, т.е. пройти список от начала до конца единожды: вернуться и повторить операцию здесь невозможно.

Итераторы очень удобно использовать в цикле for:

Здесь нам не нужно использовать функцию next для перехода к следующему значению. Это автоматически выполняет оператор in в for. Но использовать его можно только один раз. Если мы выполним цикл с этим же итератором еще раз:

То в консоли ничего не отобразится. Здесь всегда следует помнить, что итераторы перебирают коллекцию только один раз.

Некоторые функции, такие как:

позволяют работать непосредственно с итераторами. То есть, можно выполнять вот такие операции:

Будет вычислена сумма квадратов соответствующих значений. И здесь возникает, наверное, давно назревший вопрос: зачем вообще нужны эти выражения-генераторы? У этих объектов есть одно существенное преимущество по сравнению с обычными списками: они не хранят в памяти все значения сразу, а генерируют их по мере необходимости, то есть, при проходе к следующему значению. Например, если возникает необходимость оперировать очень большим списком:

то у компьютера попросту не хватит памяти и возникнет ошибка. Но генераторы-выражения смогут спокойно перебирать значения такой коллекции:

например, в цикле for:

И работать все это будет достаточно быстро, так как lst не хранит в памяти элементы, а вычисляет их налету в цикле for. Правда, из-за этого нельзя определить число элементов в генераторе при помощи функции len:

или получить доступ к его отдельному элементу по индексу:

Если нужно выполнить эти операции, то любое выражение-генератор можно превратить в обычный список. Для этого используется функция list:

В результате, переменная b ссылается на список:

[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

с которым мы уже можем работать как со списком.

Видео по теме

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#1. Первое знакомство с Python Установка на компьютер

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#2. Варианты исполнения команд. Переходим в PyCharm

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#3. Переменные, оператор присваивания, функции type и id

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#4. Числовые типы, арифметические операции

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#5. Математические функции и работа с модулем math

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#6. Функции print() и input(). Преобразование строк в числа int() и float()

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#7. Логический тип bool. Операторы сравнения и операторы and, or, not

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#8. Введение в строки. Базовые операции над строками

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#9. Знакомство с индексами и срезами строк

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#10. Основные методы строк

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#11. Спецсимволы, экранирование символов, row-строки

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#12. Форматирование строк: метод format и F-строки

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#14. Срезы списков и сравнение списков

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#15. Основные методы списков

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#16. Вложенные списки, многомерные списки

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#17. Условный оператор if. Конструкция if-else

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#18. Вложенные условия и множественный выбор. Конструкция if-elif-else

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#19. Тернарный условный оператор. Вложенное тернарное условие

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#20. Оператор цикла while

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#21. Операторы циклов break, continue и else

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#22. Оператор цикла for. Функция range()

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#23. Примеры работы оператора цикла for. Функция enumerate()

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#24. Итератор и итерируемые объекты. Функции iter() и next()

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#25. Вложенные циклы. Примеры задач с вложенными циклами

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#26. Треугольник Паскаля как пример работы вложенных циклов

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#27. Генераторы списков (List comprehensions)

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#28. Вложенные генераторы списков

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#29. Введение в словари (dict). Базовые операции над словарями

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#30. Методы словаря, перебор элементов словаря в цикле

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#31. Кортежи (tuple) и их методы

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#32. Множества (set) и их методы

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#33. Операции над множествами, сравнение множеств

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#34. Генераторы множеств и генераторы словарей

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#35. Функции: первое знакомство, определение def и их вызов

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#36. Оператор return в функциях. Функциональное программирование

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#37. Алгоритм Евклида для нахождения НОД

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#38. Именованные аргументы. Фактические и формальные параметры

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#39. Функции с произвольным числом параметров *args и **kwargs

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#40. Операторы * и ** для упаковки и распаковки коллекций

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#41. Рекурсивные функции

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#42. Анонимные (lambda) функции

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#43. Области видимости переменных. Ключевые слова global и nonlocal

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#44. Замыкания в Python

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#45. Введение в декораторы функций

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#46. Декораторы с параметрами. Сохранение свойств декорируемых функций

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#47. Импорт стандартных модулей. Команды import и from

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#48. Импорт собственных модулей

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#49. Установка сторонних модулей (pip install). Пакетная установка

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#50. Пакеты (package) в Python. Вложенные пакеты

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#51. Функция open. Чтение данных из файла

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#52. Исключение FileNotFoundError и менеджер контекста (with) для файлов

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#53. Запись данных в файл в текстовом и бинарном режимах

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#54. Выражения генераторы

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#55. Функция-генератор. Оператор yield

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#56. Функция map. Примеры ее использования

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#57. Функция filter для отбора значений итерируемых объектов

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#58. Функция zip. Примеры использования

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#59. Сортировка с помощью метода sort и функции sorted

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#60. Аргумент key для сортировки коллекций по ключу

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#61. Функции isinstance и type для проверки типов данных

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#62. Функции all и any. Примеры их использования

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#63. Расширенное представление чисел. Системы счисления

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#64. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операторы

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

#65. Модуль random стандартной библиотеки

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

Источник

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

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

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

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

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

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

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

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

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

Обратите внимание, что приведенный выше результат не является значением. Фактически это указывает, где находится объект. Чтобы получить реальное значение, воспользуйтесь итератором. Затем 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, это потребует огромной памяти. Но если вы создадите простой класс, вы сможете выполнить свою задачу, не потребляя столько памяти.

Источник

Знакомимся с продвинутыми возможностями Python: итераторы, генераторы, itertools

Что такое итераторы и генераторы. Смотреть фото Что такое итераторы и генераторы. Смотреть картинку Что такое итераторы и генераторы. Картинка про Что такое итераторы и генераторы. Фото Что такое итераторы и генераторы

В Python есть много возможностей, которые привлекают математиков. Вот некоторые из них: встроенная поддержка кортежей, списков и множеств, которые записываются практически так же, как это делается в математике, list comprehensions или генераторы списков, синтаксис которых похож на генераторы множеств, и другое.

Посмотрите пример использования. В последней строке сделана попытка превратить итератор в список. Это приводит к бесконечному циклу.

И пример использования:

Рассмотрим ещё один интересный пример: генерацию последовательности Q Хофштадтера. В приведённом ниже коде итератор используется для генерации последовательности с помощью вложенных повторений.

Вот пример использования:

Генераторы

Посмотрите, как это применяется на практике.

Одно из возможных решений — получение одновременно списка и результата.

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

Пример использования генератора:

Рекурсивные генераторы

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

Как отмечалось выше, генераторные выражения можно передавать в функции, которые нуждаются в итераторе. Например, сумму первых десяти совершенных квадратов можно получить так:

Ниже будут другие примеры генераторных выражений.

Модуль itertools

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

Обратите внимание, представленные ниже алгоритмы не являются оптимальными для практического использования. Примеры используются, чтобы показать возможности перестановок и комбинаций. На практике лучше избегать перечисления перестановок и комбинаций, если вы не имеете веской причины для этого, так как размер перечислений растёт по экспоненте.

Второй пример касается интересной математической задачи. С помощью генераторных выражений, itertools.combinations и itertools.permutations вычислим количество инверсий перестановки, а затем суммируем количество инверсий во всех перестановках в списке.

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

Адаптированный перевод статьи A Study of Python’s More Advanced Features Part I: Iterators, Generators, itertools by Sahand Saba. Мнение адмнистрации «Хекслета» может не совпадать с мнением автора оригинальной публикации.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *