Python: операторы if, elif, else, тернарного выбора и match

Раздел: Основы Python -> Условные операторы и проверки

Основные конструкции проверки условий

Программа на 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 для явной проверки.

Дополнительные примеры и расширенные сценарии

  1. Цепочки сравнений.

    Пример
    x = 5
    if 1 < x < 10:
        print('x находится между 1 и 10')
    x находится между 1 и 10

    Python позволяет объединять операторы сравнения, что эквивалентно 1 < x and x < 10.

  2. 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 - если хотя бы один.

  3. Оператор walrus (:=) внутри условия.

    Пример
    data = [4, 2, 9, 1]
    if (max_val := max(data)) > 5:
        print(f'Максимум {max_val} больше 5')
    Максимум 9 больше 5

    Присваивание и использование переменной в условии за один шаг.

  4. isinstance с проверкой типа.

    Пример
    value = 42
    if isinstance(value, int) and value > 0:
        print('Положительное целое число')
    Положительное целое число

    isinstance безопасно проверяет тип, можно комбинировать с другими условиями.

  5. 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 внутри спискового включения.

  6. 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 позволяет добавить дополнительное условие к шаблону.

Проверка условий в Python - comments

En
проверка условия в python (python)