Python генераторы: генерация списков, словарей и других последовательностей в одной строке кода
Python генераторы это инструменты, которые позволяют создавать итерируемые объекты без необходимости хранения всех данных в памяти. Они являются некой связкой между функциями и итераторами, возвращая последовательность значений в процессе их обработки.
Пример определения генератора в Python:
def my_generator():
yield 1
yield 2
yield 3
Вызов этого генератора будет возвращать итерируемый объект, который может использоваться в циклах:
for value in my_generator():
print(value)
Вывод будет таким:
1
2
3
Хотя можно использовать и обыкновенную функцию для генерации определенного списка значений:
def my_custom_function():
return [1, 2, 3]
for value in my_custom_function():
print(value)
Такой код тоже будет работать и вывести на экран список значений от 1 до 3, но достаточно поместить в функцию дополнительные вычислительные задачи и список станет огромным, что пропорционально увеличит потребление ресурсов памяти.
Генераторы же позволяют создавать последовательности из больших данных без их загрузки в память, а чтобы проиллюстрировать это свойство, можно сгенерировать последовательность простых чисел с помощью генератора:
def primes():
yield 2
primes_found = [2]
number = 3
while True:
prime = True
for divisor in range(2, number):
if divisor * divisor > number:
break
if number % divisor == 0:
prime = False
break
if prime:
primes_found.append(number)
yield number
number += 1
for value in primes():
if value > 20:
break
print(value)
Вывод будет таким:
2
3
5
7
11
13
17
19
Этот код генерирует бесконечную последовательность простых чисел, но при их появлении они сразу же добавляются в список primes_found, и благодаря свойству yield значения возвращаются "лениво", по мере необходимости, но при этом в оперативной памяти всегда хранится только последнее найденное простое число.
Использование генераторов в Python позволяет оптимизировать работу с данными, их преобразование и нахождение. Вместе с примерами кода можно увидеть использование генераторов в обработке файлов, сетевых запросов и любых других случаях сбора/обработки больших объемов данных.