Опубликован: 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()
.
next()
, предыдущее значение при этом теряется.Оценка основных статистических метрик набора данных в Python
Область эффективного использования lambda функции в Python
Логические выражения if ... else в Pythonic стиле
Способы удаления лишних пробелов в строке
Комментариев нет.