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 == 0 → True. Потом работает 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Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import solution
def test1():
assert solution.string_or_not("Hexlet") == "yes"
assert solution.string_or_not(10) == "no"
assert solution.string_or_not("") == "yes"
assert solution.string_or_not(False) == "no"
assert solution.string_or_not(True) == "no"Решение учителя откроется через:
20:00
