Генераторы списков: краткий синтаксис создания списков

🔥 Введение: Зачем нужны генераторы списков?

Представьте ситуацию: вам нужно создать список квадратов чисел от 1 до 10. Классический способ:

squares = []
for num in range(1, 11):
    squares.append(num ** 2)

Работает? Да. Красиво? Нет. Генераторы списков позволяют сделать это в одну строку:

squares = [num ** 2 for num in range(1, 11)]

Круто, правда? Давайте разберёмся, как это работает и какие ещё возможности есть у этого синтаксиса.


🛠️ Базовый синтаксис

Генератор списка (list comprehension) состоит из трёх частей:

  1. Выражение (что добавляем в список)
  2. Цикл (откуда берём элементы)
  3. Опционально: условие (фильтрация элементов)

Структура:

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

Пример с фильтрацией — только чётные квадраты:

even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
# Результат: [0, 4, 16, 36, 64]

💡 Продвинутые техники

Вложенные циклы

Можно использовать несколько циклов для создания сложных структур. Например, декартово произведение множеств:

colors = ['red', 'green']
sizes = ['S', 'M', 'L']
combinations = [(color, size) for color in colors for size in sizes]
# Результат: [('red', 'S'), ('red', 'M'), ..., ('green', 'L')]

Тернарные операторы

В выражении можно использовать условные конструкции:

grades = [85, 92, 78, 90]
result = ['Пройдено' if score >= 80 else 'Пересдача' for score in grades]
# Результат: ['Пройдено', 'Пройдено', 'Пересдача', 'Пройдено']

⚡ Производительность vs читаемость

Генераторы списков не только компактны, но и быстрее обычных циклов! Тест на 10 миллионах элементов:

# Обычный цикл: ~1.8 сек
result = []
for i in range(10_000_000):
    result.append(i * 2)

# Генератор: ~1.2 сек
result = [i * 2 for i in range(10_000_000)]

Но помните золотое правило: если конструкция становится сложной для понимания — возможно, лучше использовать обычный цикл.


🎯 Практические примеры

Обработка данных

Извлечение первых букв из списка слов:

words = ['Python', 'is', 'awesome']
first_letters = [word[0] for word in words]  # ['P', 'i', 'a']

Работа с файлами

Быстрое чтение строк без символов переноса:

lines = [line.strip() for line in open('data.txt')]

Если хотите глубже разобрать обработку данных в Python, загляните на YouTube-канал Данилы Бежина — там есть отличные разборы.


❌ Частые ошибки

  1. Переусложнение:
# Плохо
[x for x in [y ** 2 for y in range(10)] if x % 2 == 0]

# Лучше
[y ** 2 for y in range(10) if (y ** 2) % 2 == 0]
  1. Побочные эффекты:
# Избегайте!
[print(x) for x in range(5)]  # Так делать не стоит

🚀 Вывод: Когда использовать?

✔️ Да: - Простые преобразования данных - Фильтрация коллекций - Создание небольших списков

✖️ Нет: - Сложная логика с вложенными условиями - Обработка с побочными эффектами - Очень большие списки (лучше генераторы)

Генераторы списков — это ваш мощный инструмент для написания чистого, эффективного и питонического кода. Практикуйтесь, экспериментируйте, и вскоре этот синтаксис станет вашей второй натурой!

Скрыть рекламу навсегда

📘 VK Видео — обучение без ограничений

Все уроки доступны без VPN, без блокировок и зависаний.

Можно смотреть с телефона, планшета или компьютера — в любое время.

▶️ Смотреть на VK Видео