Привет! Генераторы списков — это один из самых элегантных инструментов Python. Они позволяют создавать списки в одну строку, заменяя громоздкие циклы. Код становится короче, чище и часто быстрее.
В этой статье мы разберём:
- Что такое генератор списка
- Синтаксис и базовые примеры
- Условия в генераторах
- Вложенные циклы
- Практические примеры
- Частые ошибки
- Что нужно знать перед началом
- Основная часть
- Что такое генератор списка
- Синтаксис генератора списка
- Генераторы с условиями
- Вложенные циклы в генераторах
- Вложенные генераторы
- Практические примеры
- Генератор vs цикл
- Задачи для закрепления
- Нюансы и подводные камни
- Генератор списка создаёт список в памяти
- Не злоупотребляй сложностью
- Путаница между if в конце и if-else
- Частые ошибки и как их избежать
- Ошибка 1: Обратный порядок if и for
- Ошибка 2: Путаница между [] и ()
- Ошибка 3: Слишком сложный генератор
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python
- Базовое понимание списков и циклов
Совет: Генератор списка — это способ создать список из существующего итерируемого объекта с помощью одного выражения.
Основная часть
Что такое генератор списка
Генератор списка — это способ создания списков в одну строку.
# Обычный цикл
squares = []
for x in range(10):
squares.append(x ** 2)
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# Генератор списка
squares = [x ** 2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Совет: Генератор списка не только короче, но и быстрее циклов.
Синтаксис генератора списка
[выражение for элемент in итерируемый_объект]Примеры:
# Список чисел от 0 до 9
numbers = [x for x in range(10)]
print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# Список строк в верхнем регистре
words = ["привет", "мир", "python"]
upper_words = [word.upper() for word in words]
print(upper_words) # ['ПРИВЕТ', 'МИР', 'PYTHON']
# Список длин строк
lengths = [len(word) for word in words]
print(lengths) # [6, 3, 6]Генераторы с условиями
if в конце — фильтрация:
# Только чётные числа
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
# Только строки длиннее 4 символов
words = ["cat", "python", "dog", "elephant"]
long_words = [word for word in words if len(word) > 4]
print(long_words) # ['python', 'elephant']if в выражении — преобразование:
# Чётные → квадрат, нечётные → 0
result = [x ** 2 if x % 2 == 0 else 0 for x in range(10)]
print(result) # [0, 0, 4, 0, 16, 0, 36, 0, 64, 0]
# Положительные оставляем, отрицательные заменяем на 0
numbers = [10, -5, 3, -2, 8, -1]
result = [x if x > 0 else 0 for x in numbers]
print(result) # [10, 0, 3, 0, 8, 0]Совет:
ifв конце — фильтрация.if-elseв выражении — преобразование каждого элемента.
Вложенные циклы в генераторах
# Все комбинации двух чисел от 0 до 2
combinations = [(i, j) for i in range(3) for j in range(3)]
print(combinations)
# [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]
# Таблица умножения 3x3
table = [[i * j for j in range(1, 4)] for i in range(1, 4)]
print(table)
# [[1, 2, 3], [2, 4, 6], [3, 6, 9]]Совет: Порядок циклов в генераторе соответствует порядку вложенных циклов в обычном коде.
Вложенные генераторы
# Матрица 3x3
matrix = [[j for j in range(3)] for i in range(3)]
print(matrix) # [[0, 1, 2], [0, 1, 2], [0, 1, 2]]
# Транспонирование матрицы
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transposed = [[row[i] for row in matrix] for i in range(3)]
print(transposed) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]Практические примеры
Пример 1. Очистка данных:
data = [10, 0, -5, 3, -2, 8]
positive = [x for x in data if x > 0]
print(positive) # [10, 3, 8]Пример 2. Список словарей:
users = [
{"name": "Анна", "age": 25},
{"name": "Иван", "age": 17},
{"name": "Петр", "age": 30}
]
adults = [user for user in users if user["age"] >= 18]
print(adults) # [{"name": "Анна", "age": 25}, {"name": "Петр", "age": 30}]Пример 3. Преобразование данных:
strings = ["1", "2", "3", "4", "5"]
numbers = [int(x) for x in strings]
print(numbers) # [1, 2, 3, 4, 5]Пример 4. Обработка списка чисел:
numbers = [5, -3, 8, -1, 0, -7, 4]
result = [x if x > 0 else 0 for x in numbers]
print(result) # [5, 0, 8, 0, 0, 0, 4]Генератор vs цикл
| Характеристика | Генератор | Цикл |
|---|---|---|
| Скорость | Быстрее | Медленнее |
| Читаемость | Короче | Длиннее |
| Гибкость | Ограничен | Полная |
Совет: Используй генераторы для простых операций и циклы — для сложной логики.
Задачи для закрепления
Задача 1. Создай список квадратов чисел от 0 до 5.
Задача 2. Создай список чисел от 0 до 20, которые делятся на 3.
Задача 3. Создай список строк в нижнем регистре из списка ["Привет", "Мир", "Python"].
Задача 4. Создай список из чисел от 0 до 10, заменив чётные на их квадрат, а нечётные на 0.
Задача 5. Создай матрицу 3×3 с числами от 1 до 9.
Ответы:
Задача 1.
squares = [x ** 2 for x in range(6)]
print(squares) # [0, 1, 4, 9, 16, 25]Задача 2.
div_by_3 = [x for x in range(21) if x % 3 == 0]
print(div_by_3) # [0, 3, 6, 9, 12, 15, 18]Задача 3.
words = ["Привет", "Мир", "Python"]
lower_words = [word.lower() for word in words]
print(lower_words) # ['привет', 'мир', 'python']Задача 4.
result = [x ** 2 if x % 2 == 0 else 0 for x in range(11)]
print(result) # [0, 0, 4, 0, 16, 0, 36, 0, 64, 0, 100]Задача 5.
matrix = [[i * 3 + j + 1 for j in range(3)] for i in range(3)]
print(matrix) # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]Нюансы и подводные камни
Генератор списка создаёт список в памяти
Для больших данных используй генераторные выражения (в круглых скобках).
Не злоупотребляй сложностью
Слишком сложные генераторы трудно читать. Разбивай на несколько строк.
# Слишком сложно
matrix = [[(i+j)**2 for j in range(5)] for i in range(5)]
# Читаемее
matrix = [
[(i + j) ** 2 for j in range(5)]
for i in range(5)
]Путаница между if в конце и if-else
ifв конце — фильтрует элементыif-elseв выражении — меняет значение
Частые ошибки и как их избежать
Ошибка 1: Обратный порядок if и for
Неправильно:
[x for x if x % 2 == 0 in range(10)]Правильно:
[x for x in range(10) if x % 2 == 0]Ошибка 2: Путаница между [] и ()
[] — генератор списка. () — генераторное выражение.
Ошибка 3: Слишком сложный генератор
Выноси сложную логику в отдельную функцию.
Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Базовый генератор | [x for x in range(10)] |
| С условием (фильтрация) | [x for x in range(10) if x % 2 == 0] |
| С условием (преобразование) | [x if x % 2 == 0 else 0 for x in range(10)] |
| Вложенный цикл | [(i, j) for i in range(3) for j in range(3)] |
| Вложенный генератор | [[j for j in range(3)] for i in range(3)] |
Заключение
Сегодня мы:
- Узнали, что такое генераторы списков
- Изучили синтаксис и примеры
- Разобрали условия и вложенные циклы
- Практические примеры








