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

Опубликован: 19.08.2023 89

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

Это происходит из-за того, что список (кортеж) сохраняет в памяти все свои элементы, а генератор в каждый отдельный момент сохраняет в памяти только одно значение — то, которое он возвращает.

Вот почему генераторы требуют минимум памяти и удобны при обработке больших или бесконечных массивов данных.

Классическим примером генератора является функция range().

Функция range()

Range() - это встроенная функция Python, которая возвращает итерируемый объект (range object), содержащий целые числа. С помощью этой функции можно сгенерировать последовательность чисел с определенным шагом — далее их можно легко перебирать с помощью цикла for.

У функции range( start, stop, [step] ) может быть от 1 до 3 параметров:

  • start — начало последовательности [включительно] (не обязательный параметр, по умолчанию равен 0).
  • stop — задает точку остановки последовательности [значение не включено в последовательность] (обязательный параметр).
  • step — шаг последовательности (не обязательный параметр, по умолчанию равен 1).
# генерация целых чисел от 0 до stop (не включая значение stop)
for i in range(7):  
    print(i, end='  ')  
0 1 2 3 4 5 6  

# генерация целых чисел от start до stop
for i in range(4, 11):  
    print(i, end='  ')  
4 5 6 7 8 9 10  

# генерация целых чисел от start до stop с шагом step
for i in range(4, 11, 2):  
    print(i, end='  ')  
4 6 8 10  

# последовательность в обратном порядке (не включая значение stop)
for i in range(10, 0, -1):  
    print(i, end='  ')  
10 9 8 7 6 5 4 3 2 1  

Создание генератора

Выражение, создающее генератор, очень похоже на List comprehension, отличие только в наличии круглых скобок (), вместо квадратных []:

gen = (row for row in open(file_name))

Такой способ позволяет создать генератор для чтения построчно очень больших (или бесконечных) файлов без риска переполнения оперативной памяти.

Еще одним способом создания генератора является использование в функции ключевого слова yield, вместо return:

# пример создания функции генератора чисел от 0 до 10000
def gen_numbers(args):
    num = 0
    while num < args:
        yield num
        num += 1

numbers = gen_numbers(10000)
print(next(numbers))
print(next(numbers))
print(next(numbers))
0
1
2

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

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

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

Похожие посты

Оценка основных статистических метрик набора данных в Python

Область эффективного использования lambda функции в Python

Логические выражения if ... else в Pythonic стиле

Способы удаления лишних пробелов в строке

Комментариев нет.