Синтаксис генератора списков

Синтаксис генератора списков Генераторы списков и словарей

Привет! В прошлой статье мы познакомились с генераторами списков. Теперь давайте разберём их синтаксис детально — от простых примеров до сложных конструкций.

В этой статье мы разберём:

  • Базовый синтаксис
  • Добавление условий
  • Вложенные циклы
  • Как читать и писать генераторы

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный 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]

Как читать:

  1. for x in range(10) — перебираем числа от 0 до 9
  2. x ** 2 — для каждого числа вычисляем квадрат
  3. Результат добавляется в список

Синтаксис с условием (фильтрация)

[выражение for переменная in итератор if условие]

Пример:

# Только чётные числа
evens = [x for x in range(10) if x % 2 == 0]
print(evens)   # [0, 2, 4, 6, 8]

Как читать:

  1. for x in range(10) — перебираем числа
  2. if x % 2 == 0 — проверяем, чётное ли число
  3. Если да — добавляем в список

Синтаксис с условием в выражении

[выражение_если_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)]

Как читать:

  1. Внешний цикл: for i in range(3)
  2. Внутренний цикл: for j in range(3)
  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]

Разбор:

  1. for x in range(10) — перебираем числа
  2. if x % 2 == 0 — фильтр по чётности
  3. if x > 5 — дополнительный фильтр
  4. 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
  • Использовали вложенные циклы
  • Научились читать сложные генераторы

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×