Логика и условия: if, and/or, match
Сравнения
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
Напишите функцию 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"
def grade(score):
if not 0 <= score <= 100:
return "invalid"
if score >= 90:
return "A"
elif score >= 75:
return "B"
elif score >= 60:
return "C"
return "F"
Что вернёт выражение?
| 0 | '' | 'hi' | [1] | True | |
|---|---|---|---|---|---|
0 or 'hi' |
|||||
'' and 'hi' |
|||||
[1] and 0 |
|||||
'hi' or [1] |
|||||
not 0 |
|||||
0 or '' or [1] |
Какие значения ложны (bool(x) == False)?
Напишите функцию describe(command) с помощью match. Команда — список строк:
- ["go", направление] → "Иду: <направление>"
- ["pick", предмет] → "Беру: <предмет>"
- ["quit"] → "Выход"
- что угодно другое → "Неизвестная команда"
Какие тесты проверяют код (5)
assert describe(["go", "север"]) == "Иду: север" assert describe(["pick", "ключ"]) == "Беру: ключ" assert describe(["quit"]) == "Выход" assert describe(["go"]) == "Неизвестная команда" assert describe([]) == "Неизвестная команда"
def describe(command):
match command:
case ["go", direction]:
return f"Иду: {direction}"
case ["pick", item]:
return f"Беру: {item}"
case ["quit"]:
return "Выход"
case _:
return "Неизвестная команда"
Что выведет код?
def check():
print("вызов")
return True
result = False and check()
print(result)
Чему равно 1 < 3 > 2? (True или False)
Войдите, чтобы отмечать пройденные уроки.