/
Программирование
/
Курс Python
/

Результат логических выражений

Python: Результат логических выражений

В Python значения разных типов можно использовать напрямую в логических выражениях. При этом они ведут себя как True или False в зависимости от того, относятся ли к категории truthy или falsy.

if "hello":
    print("непустая строка — truthy")  # выполнится

if not 0:
    print("ноль — falsy")              # выполнится

Falsy и Truthy значения

В Python есть фиксированный набор значений, которые считаются ложными (falsy). К ним относятся 0 и любое нулевое число (0.0), пустая строка "", пустые коллекции [], {}, set(), () (мы пока их не проходили), а также специальное значение None.

Все остальные значения считаются истинными (truthy). Это, например, любое ненулевое число (1, -3.5), непустая строка ("hi", "0") и непустые коллекции ([1], {"a": 1}, (0,)) (будем изучать в других курсах Хекслета).

Как работают логические выражения

В Python логические выражения возвращают не только True или False. Они возвращают один из своих операндов. Оператор and возвращает первый falsy-операнд или последний truthy. Оператор or возвращает первый truthy-операнд или последний falsy. Поэтому результатом может быть строка, число или любой другой объект, участвующий в выражении.

# and возвращает первый falsy или последний операнд
print("hello" and "world")  # => "world"  (оба truthy — последний)
print("" and "world")       # => ""       (первый falsy)
print(0 and "world")        # => 0        (первый falsy)

# or возвращает первый truthy или последний операнд
print("hello" or "world")   # => "hello"  (первый truthy)
print("" or "world")        # => "world"  (первый truthy)
print("" or 0)              # => 0        (оба falsy — последний)

Порядок вычисления зависит от приоритета операторов.

Приоритет (от высокого к низкому):

  ()          скобки
   ↓
  not         отрицание
   ↓
  and         логическое И
   ↓
  or          логическое ИЛИ

Пример с делением на остаток

result = 10 % 2 == 0 and "yes" or "no"
print(result)   # => "yes"

Разберем это выражение по шагам. Сначала выполняется арифметика 10 % 2 == 0True. Потом работает and: так как слева истина, результатом становится "yes". Так как "yes" является truthy, оператор or возвращает именно его.

Тот же принцип внутри функции:

def parity(number: int) -> str:
    return number % 2 == 0 and "even" or "odd"

print(parity(10))  # => "even"
print(parity(7))   # => "odd"

Примеры

print(7 % 2 == 0 and "even" or "odd")
# => "odd"

print(("" and "not empty") or "empty")
# => "empty"

print(("hello" and "not empty") or "empty")
# => "not empty"

print((-5 > 0 and "positive") or "non-positive")
# => "non-positive"

Использование в функциях

Особенность truthy и falsy значений удобно применять в функциях. Например, можно написать функцию, которая возвращает текст, если он непустой, или значение по умолчанию, если строка пустая.

def get_text_or_default(text: str, default: str = "empty") -> str:
    return text or default

print(get_text_or_default("hello"))   # => "hello"
print(get_text_or_default(""))        # => "empty"

Здесь выражение text or default работает так: если text непустой (truthy), функция вернет его. Если text пустой (falsy), функция вернет default.

Задание

Форма на сайте принимает данные от пользователя. Прежде чем обработать значение, программа проверяет, что в поле имени передана строка, а не число или другой тип. Реализуйте функцию string_or_not(), которая проверяет, является ли переданный параметр строкой. Если да, то возвращается 'yes', иначе 'no'

string_or_not('Hexlet') # 'yes'
string_or_not(10) # 'no'
string_or_not('') # 'yes'
string_or_not(False) # 'no'

Проверить то, является ли переданный параметр строкой, можно при помощи функции isinstance():

isinstance(3, str) # False
isinstance('Hexlet', str) # True

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются