Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

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

В этом уроке познакомимся с правилами преобразования аргумента и узнаем, как работать с составными выражениями и двойным отрицанием.

Правила преобразования

Посмотрите на пример:

print(0 or 1)
1

Оператор ИЛИ работает так, что его выполнение слева направо прерывается и возвращается результат первого аргумента, который можно преобразовать в True. Если такого аргумента нет, возвращается последний — правый.

Пример с оператором И:

print(0 and 1)
0

Оператор И работает так, что его выполнение слева направо прерывается и возвращается результат первого аргумента, который можно преобразовать в False. Если такого аргумента нет, возвращается последний — правый.

В Python есть два правила преобразования:

  • 0, 0.0, '' и None приводятся к False. Эти значения называют falsy. Сюда входят еще другие типы данных, которые мы будем изучать на Хекслете
  • Все остальное приводится к True

Этими правилами пользуются в разработке, например, чтобы определить значение по умолчанию:

value = name or ''
# Примеры
234 or '' # 234
'hexlet' or '' # 'hexlet'
None or '' # ''

Если name примет одно из falsy-значений, переменной value будет присвоена пустая строка. В этом случае в последующем коде мы сможем работать с value как со строкой.

Но здесь есть потенциальный баг. Если name содержит falsy значение, а переменной value можно присвоить значения типа 0, False, None, то код выше заработает неверно:

# Значение на самом деле есть,
# но оно Falsy, поэтому не выбирается на условии OR
False or '' # ''
0 or '' # ''
None or '' # ''

Составные выражения

Если соединить логические выражения между собой, можно получать довольно интересные способы решения задач с кодом.

Допустим, нам нужно реализовать код, в котором в переменную записывается:

  • Cтрока yes, если число четное
  • Строка no, если нечетное

Это можно сделать, если использовать знания, полученные выше:

# число четное
result = 10 % 2 == 0 and 'yes' or 'no' # 'yes'
# или сразу печатаем на экран
print(10 % 2 == 0 and 'yes' or 'no') # => 'yes'
# число нечетное
print(11 % 2 == 0 and 'yes' or 'no') # => 'no'

Эти выражения работают согласно порядку и приоритетам. Приоритет присваивания самый низкий, поэтому оно происходит в конце. Приоритет сравнения == выше, чем приоритет логических операторов and и or, поэтому сравнение происходит раньше. Дальше код выполняется слева направо, так как приоритет and выше, чем приоритет or. Рассмотрим по шагам:

# Для четного
# 1 шаг
10 % 2 == 0 # True
# 2 шаг
True and 'yes' # Результат — истина
# Проверка на or выполняется, но правая часть не исполняется, так как сразу возвращается 'yes'

# Для нечетного
# 1 шаг
11 % 2 == 0 # False
# 2 шаг
False and 'yes' # Результат — ложь, проверяем дальше
# 3 шаг
False or 'no' # Выбирается и возвращается 'no'

Такую же схему можно использовать с любым выражением в начале:

print(somefunc() and 'yes' or 'no')

Можете проверить себя и поэкспериментировать с кодом в Replit.

Двойное отрицание

Напомним, как выглядит операция отрицания:

answer = True
print(not answer)  # => False

При двойном отрицании итоговое значение равно начальному:

answer = True
print(not not answer)  # => True

Оператор not всегда возвращает булевое значение, независимо от типа переданого аргумента, а не заменяет значение на противоположное. Поэтому двойное отрицание тоже вернет булевое True/False.

answer = 'python'
print(not answer) # => False
print(not not answer) # => True

Ошибка выбора

Представьте, что нам нужно проверить — значение равно одному или другому. Например, переменная value должна содержать одно из двух значений: first или second. Начинающие разработчики иногда записывают это выражение так:

value == ('first' or 'second')

Однако такой код приведет к неверному результату. Необходимо вспомнить приоритет выполнения операций. Первым делом вычисляется все, что указано в скобках — 'first' or 'second'. Если выполнить этот код в Replit, то вывод будет таким:

python
Python 3.8.2 (default, Apr 12 2020, 15:53:37)
>>> 'first' or 'second'
'first'
>>>

Теперь заменим исходное выражение на частично вычисленное:

value == 'first'

Совсем не то, что мы ожидали. А теперь вернемся к началу и напишем проверку правильно:

# Скобки ставить не обязательно,
# потому что приоритет == выше чем приоритет or
value == 'first' or value == 'second'

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
с нуля
Разработка веб-приложений на Django
2 февраля 10 месяцев
Иконка программы Аналитик данных
Профессия
В разработке с нуля
Сбор, анализ и интерпретация данных
16 марта 8 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»