Генераторы списков (list comprehensions): синтаксис и примеры

Генераторы списков (list comprehensions): синтаксис и примеры Списки, словари, кортежи

Привет! Генераторы списков — это один из самых элегантных инструментов Python. Они позволяют создавать списки в одну строку, заменяя громоздкие циклы. Код становится короче, чище и часто быстрее.

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

  • Что такое генератор списка
  • Синтаксис и базовые примеры
  • Условия в генераторах
  • Вложенные циклы
  • Практические примеры
  • Частые ошибки

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

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

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

Заключение

Сегодня мы:

  • Узнали, что такое генераторы списков
  • Изучили синтаксис и примеры
  • Разобрали условия и вложенные циклы
  • Практические примеры

КВИЗ

Что дальше?

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