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) # TruePython: Результат логических выражений
В 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
