Python: операторы if, elif, else, тернарного выбора и match
Основные конструкции проверки условий
Программа на Python часто принимает решения на основе значений данных. Для этого используются условные операторы: if, elif, else. Они позволяют выполнять разные блоки кода в зависимости от истинности логических выражений.
age = 18
if age >= 18:
print('Доступ разрешен')
else:
print('Доступ запрещен')проверка условия в python (проверка условий в python)
Доступ разрешен
После двоеточия начинается блок с отступом. Важно использовать отступы (4 пробела). Типичные ошибки: забыть двоеточие, неправильный отступ, использование одного знака = для сравнения.
Ошибка: if age = 18: вызовет SyntaxError. Нужно использовать ==. Также если не поставить двоеточие, интерпретатор выдаст SyntaxError.
score = 85
if score >= 90:
grade = 'A'
elif score >= 80:
grade = 'B'
elif score >= 70:
grade = 'C'
else:
grade = 'D'
print(grade)
B
Проверки идут по порядку, как только условие истинно, остальные пропускаются. Если поменять порядок (например, сначала score >= 80, потом score >= 90), то при score=90 сработает первое, и не дойдет до второго.
Важно соблюдать порядок: более строгие условия должны идти первыми.
Как сократить простое условие до одной строки?
В Python есть тернарный условный оператор, который позволяет записать if-else в одну строку. Общий синтаксис: значение_если_истина if условие else значение_если_ложь.
age = 20
status = 'Совершеннолетний' if age >= 18 else 'Несовершеннолетний'
print(status)
Совершеннолетний
Сначала вычисляется условие, затем возвращается одно из двух значений. Цель: краткая запись для простых присваиваний.
Избегать сложных вложений; лучше использовать if-elif-else.
Как обработать множественные варианты значений с помощью сопоставления шаблонов?
Начиная с Python 3.10, доступен оператор match, который реализует сопоставление с образцом.
code = 404
match code:
case 200:
print('OK')
case 404:
print('Not Found')
case _:
print('Unknown')
Not Found
Символ _ используется как универсальный шаблон. Цель: более читаемый код при большом количестве альтернатив.
Ошибка: в Python 3.9 и ниже вызовет SyntaxError. Проверить версию интерпретатора.
Как проверить, содержит ли строка или список элемент?
Оператор in проверяет принадлежность к коллекции. is проверяет, ссылаются ли переменные на один объект.
fruits = ['apple', 'banana', 'cherry']
if 'banana' in fruits:
print('Есть банан')
Есть банан
a = [1, 2]
b = a
c = [1, 2]
print(a is b) # True
print(a is c) # False
True False
is сравнивает идентичность (id), не равенство значений. Цель: in удобен для списков, строк, множеств; is для None, True, False.
Путать is с == для сравнения содержимого. Использовать is только для сравнения с None, True, False, а для значений - ==.
Как объединить несколько условий?
Логические операторы and, or, not позволяют строить сложные условия.
age = 25
has_license = True
if age >= 18 and has_license:
print('Можно водить машину')
Можно водить машину
is_admin = False
is_moderator = True
if is_admin or is_moderator:
print('Доступ к панели управления')
Доступ к панели управления
is_blocked = False
if not is_blocked:
print('Пользователь активен')
Пользователь активен
Цель: гибкое комбинирование условий.
Приоритет операторов: not выше and, and выше or. Сложные выражения лучше оборачивать в скобки.
Как организовать проверку более сложной иерархии условий?
Внутри блока if можно разместить другой if.
age = 20
has_ticket = True
if age >= 18:
if has_ticket:
print('Проходите')
else:
print('Купите билет')
else:
print('Вход запрещен')
Проходите
Цель: когда одно условие зависит от выполнения другого.
Чрезмерная вложенность снижает читаемость. При вложенности более 2-3 уровней рассмотреть вынос проверок в отдельные переменные или использование guard clauses.
Как оптимизировать вычисление условий и избежать ошибок при проверке?
Операторы and и or вычисляют выражение слева направо и прекращают, как только результат становится определённым. Это называется коротким замыканием.
user = None
if user and user.is_active:
print('Пользователь активен')
else:
print('Пользователь не найден или неактивен')
Пользователь не найден или неактивен
Без короткого замыкания проверка user.is_active при user=None вызвала бы AttributeError. Цель: безопасная проверка цепочек вызовов.
Помнить, что and возвращает второе выражение, если первое истинно, иначе первое; or возвращает первое, если оно истинно, иначе второе.
Как корректно отличить None от пустой строки или нуля?
Использовать is None для точного сравнения с None. Для пустых контейнеров (список, строка) можно использовать сам объект в условии: он будет False, если пуст.
value = None
if value is None:
print('Значение отсутствует')
data = []
if not data:
print('Список пуст')
Значение отсутствует Список пуст
В Python None, False, 0, пустая строка, пустой список, множество, словарь считаются ложными.
Не использовать if value: для проверки на None, потому что пустой список тоже ложный. Использовать is None для явной проверки.
Дополнительные примеры и расширенные сценарии
Цепочки сравнений.
Примерx = 5 if 1 < x < 10: print('x находится между 1 и 10')x находится между 1 и 10
Python позволяет объединять операторы сравнения, что эквивалентно 1 < x and x < 10.
all() и any() с генераторами.
Примерnumbers = [1, 3, 5, 7] if all(n % 2 == 1 for n in numbers): print('Все числа нечетные')Все числа нечетные
Примерif any(n % 2 == 0 for n in numbers): print('Есть хотя бы одно четное') else: print('Нет четных')Нет четных
all возвращает True, если все элементы итерируемого объекта истинны; any - если хотя бы один.
Оператор walrus (:=) внутри условия.
Примерdata = [4, 2, 9, 1] if (max_val := max(data)) > 5: print(f'Максимум {max_val} больше 5')Максимум 9 больше 5
Присваивание и использование переменной в условии за один шаг.
isinstance с проверкой типа.
Примерvalue = 42 if isinstance(value, int) and value > 0: print('Положительное целое число')Положительное целое число
isinstance безопасно проверяет тип, можно комбинировать с другими условиями.
List comprehension с условием.
Примерnumbers = [1, 2, 3, 4, 5] even_squares = [n**2 for n in numbers if n % 2 == 0] print(even_squares)[4, 16]
Фильтрация элементов с помощью if внутри спискового включения.
match с guard (дополнительное условие).
Примерpoint = (3, 4) match point: case (x, y) if x > 0 and y > 0: print('Точка в первом квадранте') case (x, y) if x < 0 and y > 0: print('Второй квадрант') case _: print('Другое расположение')Точка в первом квадранте
Guard позволяет добавить дополнительное условие к шаблону.