Какое поведение у логических выражений с несколькими типами данных?

Логические выражения в Python с разными типами данных оцениваются, опираясь на "truthiness" каждого типа.
  • Числа: 0, 0.0 считаются False, все остальное - True.
  • Строки: Пустая строка "" считается False, непустая - True.
  • Списки, кортежи, множества, словари: Пустые считаются False, непустые - True.
  • None: Всегда считается False.
Операторы and и or возвращают не булево значение, а один из операндов. Оператор and возвращает первый False операнд или последний True операнд, если все операнды True. Оператор or возвращает первый True операнд или последний False операнд, если все операнды False.

В Python логические выражения с несколькими типами данных вычисляются в соответствии с правилами "truthiness" (истинности) и приоритетом операторов and, or, и not.

"Truthiness": Каждый объект в Python имеет значение, которое можно интерпретировать как True или False. Вот основные правила:

  • True: Все ненулевые числа, непустые строки, списки, кортежи, словари и множества. Объекты, у которых определен метод __bool__() (или __len__(), если __bool__() отсутствует), который возвращает True или ненулевое значение.
  • False: False, None, 0 (целое, вещественное, комплексное), пустые строки (""), пустые списки ([]), кортежи (()), словари ({}) и множества (set()). Объекты, у которых определен метод __bool__() (или __len__(), если __bool__() отсутствует), который возвращает False или ноль.

Оператор and: Возвращает первый "falsey" объект, если он найден. В противном случае (если все операнды "truthy") возвращает последний операнд.

Пример:


    1 and "hello"  # Возвращает "hello"
    0 and "hello"  # Возвращает 0
    "hello" and "" # Возвращает ""
    "hello" and 5  # Возвращает 5
  

Оператор or: Возвращает первый "truthy" объект, если он найден. В противном случае (если все операнды "falsey") возвращает последний операнд.

Пример:


    1 or "hello"  # Возвращает 1
    0 or "hello"  # Возвращает "hello"
    "" or False  # Возвращает False
    0 or []       # Возвращает []
  

Оператор not: Возвращает True, если операнд "falsey", и False, если операнд "truthy". Всегда возвращает булево значение (True или False).

Пример:


    not 1      # Возвращает False
    not 0      # Возвращает True
    not "hello" # Возвращает False
    not ""      # Возвращает True
    not []      # Возвращает True
  

Приоритет операторов: Оператор not имеет самый высокий приоритет, затем and, и наименьший приоритет у or. Используйте скобки для явного указания порядка вычислений.

Пример:


    True or False and False  # Эквивалентно True or (False and False) -> True or False -> True
    (True or False) and False  # Эквивалентно True and False -> False
  

Сокращенное вычисление (Short-circuit evaluation): Python использует сокращенное вычисление. Это означает, что Python перестает вычислять выражение, как только результат становится известен.

Пример:


    def side_effect():
      print("Функция вызвана!")
      return True

    False and side_effect()  # "Функция вызвана!" не будет напечатано, так как результат уже известен (False)
    True or side_effect()   # "Функция вызвана!" не будет напечатано, так как результат уже известен (True)
  

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

0