Привет! В прошлых статьях мы научились создавать генераторы списков. Теперь разберёмся, как добавлять в них условия. Это делает генераторы ещё более мощными.
В этой статье мы разберём:
ifв конце — фильтрацияif-elseв выражении — преобразование- Разницу между этими подходами
- Когда что использовать
- Что нужно знать перед началом
- Основная часть
- if в конце — фильтрация
- if-else в выражении — преобразование
- Сравнение: if в конце vs if-else в выражении
- Комбинирование условий
- Примеры из реальной жизни
- Задачи для закрепления
- Нюансы и подводные камни
- Путаница между if и if-else
- Экранирование сложных выражений
- Условия с вложенными циклами
- Частые ошибки и как их избежать
- Ошибка 1: Неправильный синтаксис if-else в выражении
- Ошибка 2: Путаница между фильтрацией и преобразованием
- Ошибка 3: Слишком сложные условия
- Шпаргалка
- Заключение / Выводы
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python
- Базовое понимание генераторов списков (статьи 1–2 в этом подменю)
Совет: Условия в генераторах могут быть двух типов. Важно различать их.
Основная часть
if в конце — фильтрация
[выражение for переменная in итератор if условие]Пример 1: Только чётные числа
even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers) # [0, 2, 4, 6, 8]Пример 2: Только строки длиннее 4 символов
words = ["cat", "python", "dog", "elephant"]
long_words = [word for word in words if len(word) > 4]
print(long_words) # ['python', 'elephant']Пример 3: Только положительные числа
numbers = [10, -5, 3, -2, 8, -1]
positive = [x for x in numbers if x > 0]
print(positive) # [10, 3, 8]Совет:
ifв конце просто фильтрует элементы. Если условие истинно — элемент попадает в список, если ложно — пропускается.
if-else в выражении — преобразование
[выражение_если_True if условие else выражение_если_False for переменная in итератор]Пример 1: Чётные — квадрат, нечётные — 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]Пример 2: Положительные оставляем, отрицательные заменяем на 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]Пример 3: Длинные слова — uppercase, короткие — lowercase
words = ["cat", "python", "dog", "elephant"]
result = [word.upper() if len(word) > 4 else word.lower() for word in words]
print(result) # ['cat', 'PYTHON', 'dog', 'ELEPHANT']Совет:
if-elseв выражении преобразует каждый элемент. Каждый элемент обрабатывается, но в зависимости от условия результат может быть разным.
Сравнение: if в конце vs if-else в выражении
if в конце | if-else в выражении | |
|---|---|---|
| Назначение | Фильтрация | Преобразование |
| Количество элементов | Может уменьшиться | Остаётся прежним |
| Пропускает элементы | Да | Нет |
| Синтаксис | [x for x in data if cond] | [x if cond else y for x in data] |
Пример сравнения:
# if в конце (фильтрация) — только чётные
even = [x for x in range(10) if x % 2 == 0]
print(even) # [0, 2, 4, 6, 8] (5 элементов)
# if-else в выражении (преобразование) — все элементы
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] (10 элементов)Комбинирование условий
Несколько условий:
# Чётные числа больше 5
result = [x for x in range(10) if x % 2 == 0 if x > 5]
print(result) # [6, 8]
# Эквивалентно
result = [x for x in range(10) if x % 2 == 0 and x > 5]
print(result) # [6, 8]Сложное преобразование:
# Если положительное — квадрат, если отрицательное — 0, если ноль — -1
numbers = [5, -3, 0, 8, -2, 0, 4]
result = [x ** 2 if x > 0 else -1 if x == 0 else 0 for x in numbers]
print(result) # [25, 0, -1, 64, 0, -1, 16]Примеры из реальной жизни
Пример 1. Обработка данных из файла:
# Список чисел (представлены в виде строк)
data = ["10", "abc", "25", "xyz", "30", "0"]
# Преобразуем в числа только валидные строки
numbers = [int(x) for x in data if x.isdigit()]
print(numbers) # [10, 25, 30, 0]Пример 2. Фильтрация списка словарей:
users = [
{"name": "Анна", "age": 25},
{"name": "Иван", "age": 17},
{"name": "Петр", "age": 30},
{"name": "Мария", "age": 16}
]
adults = [user for user in users if user["age"] >= 18]
print(adults)
# [{"name": "Анна", "age": 25}, {"name": "Петр", "age": 30}]Пример 3. Маскировка данных:
# Замена отрицательных чисел на 0
sales = [100, -5, 200, -10, 50]
sales_clean = [x if x > 0 else 0 for x in sales]
print(sales_clean) # [100, 0, 200, 0, 50]Задачи для закрепления
Задача 1. Напиши генератор, который создаёт список чисел от 0 до 20, которые делятся на 3.
Задача 2. Напиши генератор, который создаёт список чётных чисел от 0 до 10, заменяя нечётные на -1.
Задача 3. Напиши генератор, который создаёт список строк, где слова короче 5 символов приводятся к нижнему регистру, а длиннее — к верхнему.
Задача 4. Напиши генератор, который создаёт список чисел, заменяя отрицательные на 0 и оставляя положительные без изменений.
Задача 5. Напиши генератор, который создаёт список из чисел, которые одновременно делятся на 2 и на 3.
Ответы:
Задача 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.
result = [x if x % 2 == 0 else -1 for x in range(11)]
print(result) # [0, -1, 2, -1, 4, -1, 6, -1, 8, -1, 10]Задача 3.
words = ["cat", "python", "dog", "elephant"]
result = [w.upper() if len(w) > 4 else w.lower() for w in words]
print(result) # ['cat', 'PYTHON', 'dog', 'ELEPHANT']Задача 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]Задача 5.
result = [x for x in range(21) if x % 2 == 0 and x % 3 == 0]
print(result) # [0, 6, 12, 18]Нюансы и подводные камни
Путаница между if и if-else
# Неправильно (синтаксическая ошибка)
[x if x % 2 == 0 for x in range(10)]
# Правильно (фильтрация)
[x for x in range(10) if x % 2 == 0]
# Правильно (преобразование)
[x if x % 2 == 0 else -1 for x in range(10)]Экранирование сложных выражений
# Слишком сложно для одной строки
result = [x ** 2 if x > 0 else -1 if x == 0 else 0 for x in numbers]
# Лучше разбить на функцию
def transform(x):
if x > 0:
return x ** 2
elif x == 0:
return -1
else:
return 0
result = [transform(x) for x in numbers]Условия с вложенными циклами
# Фильтрация во внутреннем цикле
result = [(i, j) for i in range(3) for j in range(3) if i + j > 3]Частые ошибки и как их избежать
Ошибка 1: Неправильный синтаксис if-else в выражении
# Неправильно
[x if x % 2 == 0 for x in range(10)]
# Правильно
[x if x % 2 == 0 else -1 for x in range(10)]Ошибка 2: Путаница между фильтрацией и преобразованием
if в конце — фильтруетif-else в выражении — преобразует
Ошибка 3: Слишком сложные условия
Выноси сложную логику в функцию или несколько строк.
Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Фильтрация | [x for x in data if x > 0] |
| Преобразование | [x if x > 0 else 0 for x in data] |
| Фильтрация с несколькими условиями | [x for x in data if cond1 if cond2] |
| Преобразование с несколькими условиями | [a if c1 else b if c2 else c for x in data] |
Заключение / Выводы
Сегодня мы:
- Научились использовать
ifв конце для фильтрации - Научились использовать
if-elseв выражении для преобразования - Разобрали разницу между ними
- Решали практические задачи








