Генераторы в Python | Как использовать генераторы Python
Генерация итерируемых объектов или объектов, позволяющих перешагивать через них, считается обременительной задачей. Но в Python реализация этой болезненной задачи становится действительно гладкой. Итак, давайте продолжим и подробнее рассмотрим генераторы в Python.
Что такое генераторы в Python?
Генераторы — это в основном функции, которые возвращают проходимые объекты или элементы. Эти функции не производят все элементы сразу, а производят их по одному и только тогда, когда это необходимо. Всякий раз, когда для перебора набора элементов включается оператор for, запускается функция генератора. Генераторы также имеют ряд преимуществ.
Преимущества использования генераторов
Без генераторов в Python создание итерируемых объектов чрезвычайно сложно и долго.
Генераторы просты в реализации, поскольку они автоматически реализуются итер(), следующий() и StopIteration, которые в противном случае должны быть указаны явно.
Память сохраняется, поскольку элементы создаются по мере необходимости, в отличие от обычных функций Python. Этот факт становится очень важным, когда вам нужно создать огромное количество итераторов. Это также считается самым большим преимуществом генераторов.
Может использоваться для производства бесконечного количества предметов.
Их также можно использовать для конвейерной обработки ряда операций.
Нормальные функции против функций генератора:
Генераторы в Python создаются точно так же, как вы создаете обычные функции, используя ключевое слово ‘def’. Но функции-генераторы используют ключевое слово yield вместо return. Это делается для того, чтобы сообщить интерпретатору, что это итератор. Кроме того, функции-генераторы запускаются при вызове функции next(), а не по их имени, как в случае обычных функций. Рассмотрим следующий пример, чтобы лучше понять это:
ПРИМЕР:
def func(a):
yield a
a=[1,2,3]
b=func(a)
next(b)
ВЫХОД: [1, 2, 3]
Как видите, в приведенном выше выводе функция func() использует ключевое слово yield и следующую функцию для своего выполнения. Но для нормальной работы вам понадобится следующий фрагмент кода:
ПРИМЕР:
def func(a):
return a
a=[1,2,3]
func(a)
ВЫХОД: [1, 2, 3]
Если вы посмотрите на приведенный выше пример, вам может быть интересно, зачем использовать функцию генератора, когда обычная функция также возвращает тот же результат. Итак, давайте продолжим и посмотрим, как использовать генераторы в Python.
Использование функций генератора:
Как упоминалось ранее, генераторы в Python создают итерируемые объекты по одному. Взгляните на следующий пример:
ПРИМЕР:
def myfunc(a):
while a>=3:
yield a
a=a+1
b = myfunc(a)
print(b)
next(b)
Когда вы выполните следующую функцию, вы увидите следующий вывод:
ВЫХОД: 4
Здесь был возвращен один итерируемый объект, удовлетворяющий условию while. После выполнения управление передается вызывающей стороне. Если требуется больше элементов, ту же функцию необходимо выполнить снова, вызвав функцию next().
next(b)
ВЫХОД: 5
При дальнейшем выполнении функция вернет 6,7 и т. д. Генераторные функции в Python реализуют итер() а также следующий() методы автоматически. Таким образом, вы можете перебирать объекты, просто используя метод next(). Когда генерация элемента должна завершиться, функции Генератора реализуют Остановить итерацию внутренне, не беспокоя вызывающего абонента. Вот еще один пример этого:
ПРИМЕР:
a=2
def myfunc(a):
while a >= 0:
yield a
a -= 1
b = myfunc(a)
print(b)
next(b)
ВЫХОД:
На изображении выше показано выполнение нашей программы необходимое количество раз. Если вы попытаетесь снова вызвать следующую функцию, она вернет сообщение, изображающее Остановить итерацию был реализован. Если вы попытаетесь сделать это с помощью обычных функций, возвращаемые значения не изменятся и не будут повторяться. Взгляните на пример ниже:
ПРИМЕР:
def z():
n=1
yield n
n=n+3
yield n
p=z()
next(p)
ВЫХОД:
Генераторы с петлями:
Если вы хотите выполнить одну и ту же функцию сразу, вы можете использовать цикл for. Этот цикл помогает перебирать объекты и после всех реализаций выполняет StopIteration.
ПРИМЕР:
def z():
n=1
yield n
n=n+3
yield n
for x in z():
print(x)
ВЫХОД:
1
4
Вы также можете указать выражения для создания итерируемых объектов.
Выражения генератора:
Вы также можете использовать выражения вместе с циклом for для создания итераторов. Обычно это значительно упрощает генерацию итераций. Выражения-генераторы напоминают генераторы списков и, как и лямбда-функции, выражения-генераторы создают анонимные функции-генераторы.
Взгляните на пример ниже:
ПРИМЕР:
a=range(6)
print("List Comprehension", end=':')
b=[x+2 for x in a]
print(b)
print("Generator expression", end=':n')
c=(x+2 for x in a)
print(c)
for y in c:
print(y)
ВЫХОД:
Понимание списка:[2, 3, 4, 5, 6, 7]
Выражение генератора:
<объект-генератор
2
3
4
5
6
Как видите, в приведенном выше выводе первое выражение представляет собой понимание списка, указанное в [] скобки. Понимание списка создает полный список элементов сразу. Следующим является выражение генератора, которое возвращает одни и те же элементы, но по одному. Он указывается с помощью квадратных скобок ().
Генераторные функции также могут использоваться внутри других функций. Например:
ПРИМЕР:
a=range(6)
print("Generator expression", end=':n')
c=(x+2 for x in a)
print(c)
print(min(c))
ВЫХОД:
Выражение генератора
2
Приведенная выше программа печатает минимальное значение, когда приведенное выше выражение применяется к значениям a.
Сценарии использования:
Давайте используем генераторы в Python для:
- Генерация ряда Фибоначчи
- Генерация чисел
Генерация ряда Фибоначчи:
Ряд Фибоначчи, как мы все знаем, представляет собой ряд чисел, в котором каждое число является суммой двух предыдущих чисел. Первые два числа — 0 и 1. Вот программа-генератор для генерации рядов Фибоначчи:
ПРИМЕР:
def fibo():
first,second=0,1
while True:
yield first
first,second=second,first+second
for x in fibo():
if x>50:
break
print(x, end=" ")
ВЫХОД:
0 1 1 2 3 5 8 13 21 34
Приведенный выше вывод показывает ряд Фибоначчи со значениями меньше 50. Давайте теперь посмотрим, как создать список чисел.
Генерация чисел:
Если вы хотите сгенерировать указанные номера списка, вы можете сделать это с помощью функций генератора. Взгляните на следующий пример:
ПРИМЕР:
a=range(10)
b=(x for x in a)
print(b)
for y in b:
print(y)
ВЫХОД:
<объект генератора
0 1 2 3 4 5 6 7 8
9
ПРИМЕР:
a=range(2,10,2)
b=(x for x in a)
print(b)
for y in b:
print(y)
ВЫХОД:
<объект генератора
8
Приведенная выше программа вернула четные числа от 2 до 10. На этом мы подошли к концу этой статьи о генераторах в Python. Надеюсь, вы поняли все темы.
Есть к нам вопрос? Пожалуйста, укажите это в разделе комментариев этого блога «Генераторы на Python», и мы свяжемся с вами как можно скорее.