← Назад к вопросам
Приведи пример генератора из стандартной библиотеки в Python
1.3 Junior🔥 151 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Примеры генераторов в стандартной библиотеке Python
Генераторы — это функции, которые возвращают значения по одному, сохраняя состояние между вызовами. В стандартной библиотеке есть множество встроенных генераторов, которые экономят память и повышают производительность.
1. range() — самый распространенный генератор
# range возвращает объект, который генерирует числа по требованию
for i in range(5):
print(i) # 0, 1, 2, 3, 4
# Это экономит память, особенно с большими числами
# range(1000000) не создает список из миллиона элементов
big_range = range(1000000)
print(type(big_range)) # <class 'range'>
print(big_range[999999]) # Доступ по индексу в O(1)
# В Python 2 это был список (очень затратно!)
# В Python 3 это генератор (эффективно)
2. enumerate() — генератор с индексами
words = ["apple", "banana", "cherry"]
# enumerate генерирует пары (индекс, значение)
for index, word in enumerate(words):
print(f"{index}: {word}")
# 0: apple
# 1: banana
# 2: cherry
# Можно начать с другого индекса
for index, word in enumerate(words, start=1):
print(f"{index}: {word}")
# 1: apple
# 2: banana
# 3: cherry
# Это не создает отдельный список, а генерирует значения на лету
3. zip() — генератор пар из нескольких итерируемых
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
cities = ["New York", "London", "Paris"]
# zip создает пары из элементов нескольких списков
for name, age, city in zip(names, ages, cities):
print(f"{name}, {age}, живет в {city}")
# Alice, 25, живет в New York
# Bob, 30, живет в London
# Charlie, 35, живет в Paris
# zip генерирует по одной паре за раз
result = zip(names, ages)
print(type(result)) # <class 'zip'> — генератор
# Это очень полезно для больших наборов данных
data1 = range(1000000)
data2 = range(1000000)
zipped = zip(data1, data2) # Не создает список из 2 млн элементов
4. map() — генератор для трансформации
numbers = [1, 2, 3, 4, 5]
# map применяет функцию к каждому элементу
def square(x):
return x ** 2
squared = map(square, numbers)
print(type(squared)) # <class 'map'> — генератор
print(list(squared)) # [1, 4, 9, 16, 25]
# С lambda функциями
result = map(lambda x: x * 2, numbers)
print(list(result)) # [2, 4, 6, 8, 10]
# Очень эффективно для больших данных
big_numbers = range(1000000)
big_squared = map(lambda x: x ** 2, big_numbers)
first_10 = [next(big_squared) for _ in range(10)] # Вычисляет только 10 значений
5. filter() — генератор для фильтрации
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# filter оставляет только элементы, для которых функция вернула True
def is_even(x):
return x % 2 == 0
evens = filter(is_even, numbers)
print(type(evens)) # <class 'filter'> — генератор
print(list(evens)) # [2, 4, 6, 8, 10]
# С lambda
odds = filter(lambda x: x % 2 != 0, numbers)
print(list(odds)) # [1, 3, 5, 7, 9]
# Лучше использовать list comprehension (более Pythonic)
evens_list = [x for x in numbers if x % 2 == 0]
6. reversed() — генератор обратного порядка
words = ["apple", "banana", "cherry"]
# reversed генерирует элементы в обратном порядке
for word in reversed(words):
print(word)
# cherry
# banana
# apple
print(type(reversed(words))) # <class 'reversed'> — генератор
# Работает с любыми последовательностями
for char in reversed("hello"):
print(char) # o, l, l, e, h
7. itertools модуль — "игровая площадка" генераторов
import itertools
# itertools.count() — бесконечный генератор
counter = itertools.count(start=0, step=1)
first_10 = [next(counter) for _ in range(10)]
print(first_10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# itertools.cycle() — повторяет последовательность бесконечно
colors = ["red", "green", "blue"]
cycled = itertools.cycle(colors)
first_9 = [next(cycled) for _ in range(9)]
print(first_9) # ["red", "green", "blue", "red", "green", "blue", ...]
# itertools.repeat() — повторяет одно значение
repeated = itertools.repeat("x", 5)
print(list(repeated)) # ["x", "x", "x", "x", "x"]
# itertools.chain() — объединяет несколько итерируемых
list1 = [1, 2, 3]
list2 = [4, 5, 6]
chained = itertools.chain(list1, list2)
print(list(chained)) # [1, 2, 3, 4, 5, 6]
# itertools.combinations() и itertools.permutations()
from itertools import combinations, permutations
letters = ["a", "b", "c"]
combs = combinations(letters, 2)
print(list(combs)) # [("a", "b"), ("a", "c"), ("b", "c")]
perms = permutations(letters, 2)
print(list(perms)) # [("a", "b"), ("a", "c"), ("b", "a"), ...]
8. os.walk() — генератор для обхода директорий
import os
# os.walk() генерирует кортежи (directoryname, dirnames, filenames)
for dirpath, dirnames, filenames in os.walk("."):
print(f"Директория: {dirpath}")
print(f"Поддиректории: {dirnames}")
print(f"Файлы: {filenames}")
print()
# Это экономит память при обходе больших директорий
9. dict.items(), dict.keys(), dict.values() — генераторы словарей
user = {"name": "Alice", "age": 25, "city": "New York"}
# .items() генерирует пары ключ-значение
for key, value in user.items():
print(f"{key}: {value}")
# .keys() генерирует ключи
for key in user.keys():
print(key)
# .values() генерирует значения
for value in user.values():
print(value)
# В Python 3 это генераторы представлений, не списки
print(type(user.items())) # <class 'dict_items'>
10. open() в Python — ленивый генератор файла
# Итерация по файлу не загружает весь файл в память
with open("large_file.txt") as f:
for line in f: # Файл генерирует по одной строке за раз
print(line.strip())
# Это очень эффективно для больших файлов (гигабайты)
# Без генератора пришлось бы загружать весь файл в память
Сравнение: список vs генератор
import sys
# Список — занимает много памяти
big_list = [i for i in range(1000000)]
print(f"Размер списка: {sys.getsizeof(big_list)} байт") # ~8 миллионов
# Генератор — почти не занимает памяти
big_range = range(1000000)
print(f"Размер range: {sys.getsizeof(big_range)} байт") # ~48 байт
# Практически такой же результат, но в 166 раз меньше памяти!
Вывод
Генераторы в стандартной библиотеке (range, enumerate, zip, map, filter, reversed, itertools и другие) — это мощные инструменты для эффективной работы с данными. Они:
- Экономят память (ленивые вычисления)
- Повышают производительность
- Позволяют работать с бесконечными последовательностями
- Делают код более читаемым и Pythonic
Всегда выбирай генератор вместо списка, когда нужно итерировать по данным один раз.