Добавить в корзинуПозвонить
Найти в Дзене
PythonTalk

5 логических «ловушек» в Python

Привет! Если вы думаете, что программирование — это сухая и строгая логика, то Python готов с вами поспорить. Иногда он ведет себя как хитрый фокусник, который показывает одно, а под капотом происходит совсем другое. Я собрал 5 классических примеров, на которых спотыкаются новички (и не только). Давайте разберемся, почему они работают именно так, и научимся не попадаться в эти ловушки. Казалось бы, что может быть проще? Логическое «ИЛИ». Но что выведет этот код? print(0 or "Привет" or []) Многие скажут True. И ошибутся. Правильный ответ — "Привет". Почему так? В Python оператор or — это не просто логическая операция, а «оператор выбора». Он ищет первый правдивый объект и немедленно его возвращает. Что Python считает правдой, а что ложью? В нашем примере Python видит 0 (ложь), идет дальше, видит строку "Привет" (правда!) и тут же возвращает ее, даже не посмотрев на пустой список в конце. Хорошо, с or разобрались. А что насчет его брата, оператора and? Что выведет этот код? print("Важно"
Оглавление

Привет! Если вы думаете, что программирование — это сухая и строгая логика, то Python готов с вами поспорить. Иногда он ведет себя как хитрый фокусник, который показывает одно, а под капотом происходит совсем другое.

Я собрал 5 классических примеров, на которых спотыкаются новички (и не только). Давайте разберемся, почему они работают именно так, и научимся не попадаться в эти ловушки.

Ошибка №1: Думать, что or всегда возвращает True или False

Казалось бы, что может быть проще? Логическое «ИЛИ». Но что выведет этот код?

print(0 or "Привет" or [])

Многие скажут True. И ошибутся. Правильный ответ — "Привет".

Почему так?

В Python оператор or — это не просто логическая операция, а «оператор выбора». Он ищет первый правдивый объект и немедленно его возвращает.

Что Python считает правдой, а что ложью?

  • Ложь (falsy): это 0, False, None и любые пустые штуки — пустая строка "", пустой список [] и так далее.
  • Правда (truthy): это всё остальное. Любое ненулевое число, любая непустая строка, любой непустой список.

В нашем примере Python видит 0 (ложь), идет дальше, видит строку "Привет" (правда!) и тут же возвращает ее, даже не посмотрев на пустой список в конце.

Ошибка №2: Ждать от and такого же поведения

Хорошо, с or разобрались. А что насчет его брата, оператора and?

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

print("Важно" and [] and "Мусор")

Правильный ответ — пустой список [].

Почему так?

Оператор and работает наоборот. Он ищет первый ложный объект и возвращает его. Он как строгий ревизор, которому достаточно найти одну проблему, чтобы забраковать всё.

Python видит строку "Важно" (правда), идет дальше. Натыкается на пустой список [] (ложь!) и тут же возвращает его. До строки "Мусор" дело даже не доходит.

Ошибка №3: Неправильно читать цепочки сравнений

Это классика. Представим, что у нас есть переменная x = 15.

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

print(10 < x < 20 == True)

Логично предположить, что True, ведь 15 действительно находится между 10 и 20. Но Python выведет False.

Почему так?

Python читает эту запись как цепочку, соединенную оператором and: 10 < 15 and 15 < 20 and 20 == True.

Первые два условия (10 < 15 и 15 < 20) истинны. А вот третье, 20 == True, — ложно. При сравнении числа и булева значения, True ведет себя как 1, а False как 0. А 20 никак не равно 1. В итоге вся цепочка становится ложной.

А вот если бы мы поставили скобки (10 < x < 20) == True, то сначала бы вычислилось выражение в них (оно равно True), и мы бы получили True == True, что уже верно.

Ошибка №4: Писать сложные проверки там, где не нужно

Представьте, что вам нужно спросить имя пользователя. Если он ничего не ввел, нужно подставить значение по умолчанию "Гость".

Новички часто пишут так:

name = input("Введите имя: ")
if name == "":
name = "Гость"

Это работает. Но это многословно. Зная, как работает or, можно написать в одну строку:

name = input("Введите имя: ") or "Гость"

Если пользователь введет имя, input вернет непустую строку (правда), и or вернет именно ее. Если пользователь нажмет Enter, input вернет пустую строку "" (ложь), и or вернет то, что стоит после него — "Гость".

Ошибка №5: Думать, что математика и логика несовместимы

Вот вам реальная задачка: нужно складывать цифры числа, пока оно не станет однозначным (например, 942 -> 9+4+2=15 -> 1+5=6). Решение обычно требует циклов или рекурсии.

Но зная трюки, можно решить ее так:

n % 9 or n and 9

Разбирать эту магию в деталях мы сейчас не будем (она основана на свойствах деления на 9), но поверьте, она идеально работает благодаря хитрому поведению and и or, которое мы обсудили выше.

Вывод

Python — язык с двойным дном. Зная эти неочевидные механики, вы не только перестанете попадаться в ловушки, но и начнете писать более короткий, элегантный и по-настоящему «питоничный» код.

Больше таких разборов и интересных задачек вы найдете в Telegram-канале 👈🏻