Привет! В прошлой статье мы познакомились с генераторами списков. Теперь давайте разберём их синтаксис детально — от простых примеров до сложных конструкций.
В этой статье мы разберём:
- Базовый синтаксис
- Добавление условий
- Вложенные циклы
- Как читать и писать генераторы
- Что нужно знать перед началом
- Основная часть
- Базовый синтаксис
- Синтаксис с условием (фильтрация)
- Синтаксис с условием в выражении
- Синтаксис с вложенными циклами
- Синтаксис с вложенными циклами и условиями
- Полный синтаксис
- Как читать сложные генераторы
- Практические примеры
- Задачи для закрепления
- Нюансы и подводные камни
- Путаница между if в конце и if в выражении
- Вложенные циклы — не перепутай порядок
- Генератор списка vs генераторное выражение
- Частые ошибки и как их избежать
- Ошибка 1: Неправильный порядок циклов
- Ошибка 2: Забыл квадратные скобки
- Ошибка 3: Путаница if и else в выражении
- Шпаргалка
- Заключение / Выводы
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python
- Базовое понимание списков и циклов (статья 1 в этом подменю)
Совет: Генератор списка состоит из трёх частей: выражения, цикла
forи опционального условияif.
Основная часть
Базовый синтаксис
[выражение for переменная in итератор]Пример:
# Список квадратов чисел от 0 до 9
squares = [x ** 2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Как читать:
for x in range(10)— перебираем числа от 0 до 9x ** 2— для каждого числа вычисляем квадрат- Результат добавляется в список
Синтаксис с условием (фильтрация)
[выражение for переменная in итератор if условие]Пример:
# Только чётные числа
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]Как читать:
for x in range(10)— перебираем числаif x % 2 == 0— проверяем, чётное ли число- Если да — добавляем в список
Синтаксис с условием в выражении
[выражение_если_True if условие else выражение_если_False for переменная in итератор]Пример:
# Чётные оставляем, нечётные заменяем на 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-else. Он отличается отifв конце, который фильтрует элементы.
Синтаксис с вложенными циклами
[выражение for переменная1 in итератор1 for переменная2 in итератор2]Пример:
# Все комбинации двух чисел от 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)]Как читать:
- Внешний цикл:
for i in range(3) - Внутренний цикл:
for j in range(3) - Результат:
(i, j)
Эквивалентный код:
combinations = []
for i in range(3):
for j in range(3):
combinations.append((i, j))Совет: Порядок циклов в генераторе соответствует порядку вложенных циклов в обычном коде.
Синтаксис с вложенными циклами и условиями
[выражение for a in iterable1 for b in iterable2 if условие]Пример:
# Пары (i, j), где i + j > 3
pairs = [(i, j) for i in range(3) for j in range(3) if i + j > 3]
print(pairs) # [(1, 3), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]Полный синтаксис
[выражение for переменная1 in итератор1 if условие1
for переменная2 in итератор2 if условие2
...
for переменнаяN in итераторN if условиеN]Пример:
# Произведения чисел из двух списков, где результат > 5
list1 = [1, 2, 3]
list2 = [2, 3, 4]
result = [a * b for a in list1 for b in list2 if a * b > 5]
print(result) # [6, 8, 9, 12]Как читать сложные генераторы
# Сложный генератор
result = [x ** 2 for x in range(10) if x % 2 == 0 if x > 5]Разбор:
for x in range(10)— перебираем числаif x % 2 == 0— фильтр по чётностиif x > 5— дополнительный фильтрx ** 2— выражение
Эквивалентный код:
result = []
for x in range(10):
if x % 2 == 0:
if x > 5:
result.append(x ** 2)Результат: [36, 64]
Практические примеры
Пример 1. Транспонирование матрицы:
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]]Пример 2. Очистка данных:
data = [10, 0, -5, 3, -2, 8]
positive_squares = [x ** 2 for x in data if x > 0]
print(positive_squares) # [100, 9, 64]Пример 3. Обработка списка строк:
words = ["hello", "world", "python"]
lengths = [len(word) for word in words]
print(lengths) # [5, 5, 6]Задачи для закрепления
Задача 1. Напиши генератор, который создаёт список чисел от 0 до 20, делящихся на 3.
Задача 2. Напиши генератор, который создаёт список квадратов чётных чисел от 0 до 10.
Задача 3. Напиши генератор, который создаёт список строк в нижнем регистре из списка.
Задача 4. Напиши генератор, который создаёт список всех пар (i, j) для i и j от 0 до 2.
Задача 5. Напиши генератор, который создаёт список чисел, заменяя отрицательные на 0.
Ответы:
Задача 1.
div_by_3 = [x for x in range(21) if x % 3 == 0]
print(div_by_3) # [0, 3, 6, 9, 12, 15, 18]Задача 2.
even_squares = [x ** 2 for x in range(11) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64, 100]Задача 3.
words = ["Привет", "Мир", "Python"]
lower_words = [w.lower() for w in words]
print(lower_words) # ['привет', 'мир', 'python']Задача 4.
pairs = [(i, j) for i in range(3) for j in range(3)]
print(pairs) # [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]Задача 5.
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]Нюансы и подводные камни
Путаница между if в конце и if в выражении
# Фильтрация (if в конце)
[x for x in range(10) if x % 2 == 0] # [0, 2, 4, 6, 8]
# Преобразование (if в выражении)
[x if x % 2 == 0 else 0 for x in range(10)] # [0, 0, 2, 0, 4, 0, 6, 0, 8, 0]Вложенные циклы — не перепутай порядок
# Правильно
[(i, j) for i in range(3) for j in range(3)]
# Неправильно
[(i, j) for j in range(3) for i in range(3)]Генератор списка vs генераторное выражение
# Создаёт список (все элементы в памяти)
[x ** 2 for x in range(1000000)] # []
# Создаёт генератор (ленивое вычисление)
(x ** 2 for x in range(1000000)) # ()Частые ошибки и как их избежать
Ошибка 1: Неправильный порядок циклов
Внешний цикл идёт первым, внутренний — вторым.
Ошибка 2: Забыл квадратные скобки
Генератор списка всегда в [].
Ошибка 3: Путаница if и else в выражении
if в конце — фильтрация. if-else в выражении — преобразование.
Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Базовый | [expr for x in iter] |
| С фильтром | [expr for x in iter if cond] |
| С преобразованием | [expr_if_true if cond else expr_if_false for x in iter] |
| Вложенный цикл | [expr for a in iter1 for b in iter2] |
| Полный синтаксис | [expr for a in it1 if c1 for b in it2 if c2] |
Заключение / Выводы
Сегодня мы:
- Разобрали базовый синтаксис
- Добавили условия
if - Использовали вложенные циклы
- Научились читать сложные генераторы








