Генераторы списков: краткий синтаксис создания списков
🔥 Введение: Зачем нужны генераторы списков?
Представьте ситуацию: вам нужно создать список квадратов чисел от 1 до 10. Классический способ:
squares = []
for num in range(1, 11):
squares.append(num ** 2)
Работает? Да. Красиво? Нет. Генераторы списков позволяют сделать это в одну строку:
squares = [num ** 2 for num in range(1, 11)]
Круто, правда? Давайте разберёмся, как это работает и какие ещё возможности есть у этого синтаксиса.
🛠️ Базовый синтаксис
Генератор списка (list comprehension) состоит из трёх частей:
- Выражение (что добавляем в список)
- Цикл (откуда берём элементы)
- Опционально: условие (фильтрация элементов)
Структура:
[выражение 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-канал Данилы Бежина — там есть отличные разборы.
❌ Частые ошибки
- Переусложнение:
# Плохо
[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]
- Побочные эффекты:
# Избегайте!
[print(x) for x in range(5)] # Так делать не стоит
🚀 Вывод: Когда использовать?
✔️ Да: - Простые преобразования данных - Фильтрация коллекций - Создание небольших списков
✖️ Нет: - Сложная логика с вложенными условиями - Обработка с побочными эффектами - Очень большие списки (лучше генераторы)
Генераторы списков — это ваш мощный инструмент для написания чистого, эффективного и питонического кода. Практикуйтесь, экспериментируйте, и вскоре этот синтаксис станет вашей второй натурой!