Python: Результат логических выражений
В Python значения разных типов можно использовать напрямую в логических выражениях. При этом они ведут себя как True
или False
в зависимости от того, относятся ли к категории truthy или falsy.
Falsy и Truthy значения
В Python есть фиксированный набор значений, которые считаются ложными (falsy
):
0
— любое нулевое число (0
,0.0
)- пустая строка
""
- пустые коллекции —
[]
,{}
,set()
,()
(мы пока их не проходили) - специальное значение
None
Все остальные значения считаются истинными (truthy
). Например:
- любое ненулевое число (
1
,-3.5
) - непустая строка (
"hi"
,"0"
) - непустые коллекции (
[1]
,{"a": 1}
,(0,)
) (будем изучать на Хекслете)
Пример с делением на остаток
result = 10 % 2 == 0 and "yes" or "no"
print(result) # => "yes"
Здесь выражение читается так:
- Сначала выполняется арифметика
10 % 2 == 0
→True
. - Потом работает
and
: так как слева истина, результатом становится"yes"
. - Так как
"yes"
— truthy, операторor
возвращает именно его.
Как работают логические выражения
В Python логические выражения возвращают не обязательно True
или False
. Они возвращают один из своих операндов:
- оператор
and
возвращает первый falsy-операнд или последний truthy, - оператор
or
возвращает первый truthy-операнд или последний falsy.
Поэтому результатом может быть строка, число или любой другой объект, участвующий в выражении.
Примеры
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 index
def test1():
assert index.string_or_not("Hexlet") == "yes"
assert index.string_or_not(10) == "no"
assert index.string_or_not("") == "yes"
assert index.string_or_not(False) == "no"
assert index.string_or_not(True) == "no"
Решение учителя откроется через:
20:00
