Логика и условия: if, and/or, match

⏱ 30 мин · 🧩 заданий: 6

Сравнения

x = 7
print(x == 7, x != 7, x > 5, x <= 3)
print(1 <= x <= 10)          # цепочка: 1 <= x and x <= 10
print("abc" < "abd", [1, 2] < [1, 3], (1, 2) == (1, 2))

Цепочки сравнений — особенность Python: a < b < c означает a < b and b < c, причём b вычисляется один раз.

== и is

== сравнивает значения, is — проверяет, что это один и тот же объект. is используют только для None, True, False (синглтонов): if x is None. Подробно — в модуле «Модель данных».

Логические операторы

Оператор Возвращает
not x True, если x ложно
a and b a, если a ложно; иначе b
a or b a, если a истинно; иначе b
print(0 or "по умолчанию")       # "по умолчанию"
print("имя" or "по умолчанию")   # "имя"
print(0 and 1 / 0)               # 0 — правая часть не вычисляется!
name = ""
display = name or "Гость"
print(display)

Короткое замыкание: and не вычисляет правую часть, если левая ложна; or — если левая истинна. Это используют для защиты: if user and user.is_admin: — не упадёт, если user равен None.

Ловушка or для значений по умолчанию

count = value or 10 вернёт 10 не только для None, но и для 0. Если 0 — допустимое значение, пишите явно: count = 10 if value is None else value.

Истинность (truthiness)

Любой объект можно проверить в if. Ложны: False, None, 0, 0.0, пустые "", [], (), {}, set(), range(0). Всё остальное истинно.

for value in [0, 1, -1, "", "0", " ", [], [0], {}, None, 0.0]:
    print(f"{value!r:>6} → {bool(value)}")

Идиоматично писать if items: вместо if len(items) > 0:, и if not text: вместо if text == "":.

if / elif / else

temperature = 18
if temperature >= 30:
    print("Жара")
elif temperature >= 20:
    print("Тепло")
elif temperature >= 10:
    print("Прохладно")
else:
    print("Холодно")

Проверки идут сверху вниз; выполняется первая истинная ветка. Порядок важен: от более строгого условия к менее строгому.

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

age = 17
status = "взрослый" if age >= 18 else "несовершеннолетний"
print(status)

Оператор «морж» := (Python 3.8+)

Присваивает и сразу возвращает значение:

data = [3, 8, 1, 9, 4]
if (n := len(data)) > 3:
    print(f"Длинный список: {n} элементов")

#  частое применение — цикл чтения
lines = iter(["первая", "вторая", ""])
while (line := next(lines)):
    print("строка:", line)

match / case (Python 3.10+)

Сопоставление с образцом — не просто «switch», а разбор структуры данных:

def handle(event):
    match event:
        case {"type": "click", "x": x, "y": y}:
            return f"Клик в ({x}, {y})"
        case {"type": "key", "key": "Enter" | "Return"}:
            return "Нажат Enter"
        case {"type": "key", "key": k} if len(k) == 1:
            return f"Символ {k!r}"
        case [first, *rest]:
            return f"Список: первый {first}, ещё {len(rest)}"
        case int() | float() as number if number < 0:
            return "Отрицательное число"
        case None:
            return "Пусто"
        case _:
            return "Что-то другое"

for e in [{"type": "click", "x": 10, "y": 20}, {"type": "key", "key": "Enter"},
          {"type": "key", "key": "a"}, [1, 2, 3], -5, None, "?"]:
    print(handle(e))
Образец Что совпадает
42, "text", None литерал
x что угодно, значение попадает в x
_ что угодно (без привязки)
[a, b], [first, *rest] последовательность нужной длины
{"key": v} словарь, содержащий ключ
Point(x=0, y=y) объект класса с атрибутами
A \| B одно из
case ... if условие с дополнительной проверкой (guard)

Имя в case — это захват, а не сравнение

case RED: не сравнивает с переменной RED, а присваивает ей значение и совпадает всегда. Для констант используйте точку: case Color.RED:.

Итог

  • Сравнения образуют цепочки: 0 <= x < 10.
  • and/or возвращают операнд и вычисляются лениво (короткое замыкание).
  • Ложны: None, False, ноль, пустые коллекции и строки.
  • if/elif/else, тернарный a if cond else b, морж :=, match/case для разбора структур.

Практика решено 0 из 6

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Программа на Python

Напишите функцию grade(score), которая по баллу от 0 до 100 возвращает оценку: 90 и выше — "A", 75–89 — "B", 60–74 — "C", ниже 60 — "F". Если балл вне диапазона 0–100, верните "invalid".

Какие тесты проверяют код (8)
assert grade(95) == "A"
assert grade(90) == "A"
assert grade(89) == "B"
assert grade(75) == "B"
assert grade(60) == "C"
assert grade(0) == "F"
assert grade(101) == "invalid"
assert grade(-1) == "invalid"
Задание 2 Заполнить таблицу

Что вернёт выражение?

0'''hi'[1]True
0 or 'hi'
'' and 'hi'
[1] and 0
'hi' or [1]
not 0
0 or '' or [1]
Отметьте ячейку — «+», пустая — «−».
Задание 3 Несколько вариантов

Какие значения ложны (bool(x) == False)?

Задание 4 Программа на Python

Напишите функцию describe(command) с помощью match. Команда — список строк: - ["go", направление] → "Иду: <направление>" - ["pick", предмет] → "Беру: <предмет>" - ["quit"] → "Выход" - что угодно другое → "Неизвестная команда"

Какие тесты проверяют код (5)
assert describe(["go", "север"]) == "Иду: север"
assert describe(["pick", "ключ"]) == "Беру: ключ"
assert describe(["quit"]) == "Выход"
assert describe(["go"]) == "Неизвестная команда"
assert describe([]) == "Неизвестная команда"
Задание 5 Один вариант ответа

Что выведет код?

def check():
    print("вызов")
    return True

result = False and check()
print(result)
Задание 6 Ввод ответа

Чему равно 1 < 3 > 2? (True или False)

Войдите, чтобы отмечать пройденные уроки.