Привет! Ты уже знаешь, как создавать списки в Python с помощью циклов. Но есть способ делать это короче, красивее и быстрее — генераторы списков (list comprehensions). Это один из самых элегантных инструментов Python, который любят многие разработчики.
В этой статье мы разберём:
- Что такое генератор списка
- Синтаксис и базовые примеры
- Условия в генераторах
- Вложенные генераторы
- Что нужно знать перед началом
- Основная часть
- Что такое генератор списка
- Базовые примеры
- Генераторы с условиями
- Вложенные генераторы
- Ещё примеры
- Задачи для закрепления
- Нюансы и подводные камни
- Когда не использовать генераторы
- Генератор с двумя циклами
- Читаемость
- Частые ошибки и как их избежать
- Ошибка 1: Обратный порядок if и for
- Ошибка 2: Условие в выражении вместо фильтрации
- Ошибка 3: Путаница между генератором списка и циклом
- Шпаргалка
- Заключение / Выводы
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python
- Базовое понимание списков и циклов
Совет: Генератор списка — это способ создать новый список из существующего итерируемого объекта с помощью одного выражения. Он делает код чище и читаемее.
Основная часть
Что такое генератор списка
Генератор списка — это способ создания списков в одну строку с использованием выражения и цикла for.
Синтаксис:
[выражение for элемент in итерируемый_объект]Пример:
# Создаём список квадратов чисел от 0 до 9
squares = [x ** 2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Совет: Это эквивалентно следующему коду, но короче:
squares = []
for x in range(10):
squares.append(x ** 2)
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Базовые примеры
Список чисел от 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']Список длин строк:
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]if в выражении — преобразование:
# Чётные оставляем как есть, нечётные заменяем на 0
result = [x if x % 2 == 0 else 0 for x in range(10)]
print(result) # [0, 0, 2, 0, 4, 0, 6, 0, 8, 0]Совет: Разница между
ifв выражении иifв конце:
ifв конце — фильтрует элементыifв выражении — меняет значение
Вложенные генераторы
# Создание матрицы 3x3 (список списков)
matrix = [[j for j in range(3)] for i in range(3)]
print(matrix) # [[0, 1, 2], [0, 1, 2], [0, 1, 2]]Разбор вложенного генератора:
- Внешний цикл:
for i in range(3)(3 строки) - Внутренний цикл:
for j in range(3)(3 столбца) - Значение:
j
Ещё примеры
Список чисел, которые делятся на 3:
divisible_by_3 = [x for x in range(20) if x % 3 == 0]
print(divisible_by_3) # [0, 3, 6, 9, 12, 15, 18]Список квадратов нечётных чисел от 1 до 10:
odd_squares = [x ** 2 for x in range(1, 11) if x % 2 != 0]
print(odd_squares) # [1, 9, 25, 49, 81]Список чисел из строки с преобразованием в int:
string_numbers = "1 2 3 4 5"
numbers = [int(x) for x in string_numbers.split()]
print(numbers) # [1, 2, 3, 4, 5]Задачи для закрепления
Задача 1. Создай список квадратов чисел от 0 до 5.
Задача 2. Создай список из чисел от 0 до 20, которые делятся на 5.
Задача 3. Создай список строк в нижнем регистре из списка ["Привет", "Мир", "Python"].
Задача 4. Создай список из чисел от 0 до 10, заменив чётные на их квадрат, а нечётные на 0.
Задача 5. Создай список из кортежей (x, x**2) для x от 0 до 5.
Ответы:
Задача 1.
squares = [x ** 2 for x in range(6)]
print(squares) # [0, 1, 4, 9, 16, 25]Задача 2.
div_by_5 = [x for x in range(21) if x % 5 == 0]
print(div_by_5) # [0, 5, 10, 15, 20]Задача 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.
pairs = [(x, x ** 2) for x in range(6)]
print(pairs) # [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]Нюансы и подводные камни
Когда не использовать генераторы
Генератор списка создаёт сразу весь список. Для очень больших данных лучше использовать генераторные выражения (в круглых скобках):
# Генератор списка (создаёт сразу весь список)
squares = [x ** 2 for x in range(1000000)] # Заняло память
# Генераторное выражение (ленивое вычисление)
squares = (x ** 2 for x in range(1000000)) # Экономит памятьГенератор с двумя циклами
# Все комбинации двух чисел
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)]Читаемость
Слишком сложные генераторы лучше разбивать на несколько строк:
# Слишком сложно
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)
]Частые ошибки и как их избежать
Ошибка 1: Обратный порядок if и for
Неправильно:
[x for x if x % 2 == 0 in range(10)]Правильно:
[x for x in range(10) if x % 2 == 0]Ошибка 2: Условие в выражении вместо фильтрации
Неправильно (фильтрация):
[x for x in range(10) if x % 2 == 0] # ЧётныеПравильно (фильтрация):
[x for x in range(10) if x % 2 == 0] # Только чётныеОшибка 3: Путаница между генератором списка и циклом
Неправильно (не работает):
x for x in range(10) # Не работает без []Правильно:
[x for x in range(10)] # С []Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Базовый генератор | [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)] |
| Вложенный генератор | [[j for j in range(3)] for i in range(3)] |
| Генераторное выражение | (x for x in range(10)) |
Заключение / Выводы
Сегодня мы:
- Узнали, что такое генераторы списков
- Изучили синтаксис и базовые примеры
- Разобрали условия в генераторах
- Познакомились с вложенными генераторами








