Python: Логические операторы
Мы уже умеем писать функции, которые проверяют одиночные условия. А в этом уроке научимся строить составные условия.
Предположим, что сайт при регистрации требует, чтобы пароль был длиннее восьми символов и содержал хотя бы одну заглавную букву. Попробуем написать два отдельных логических выражения и соединим их специальным оператором «И»:
Пароль длиннее 8 символов И пароль содержит хотя бы одну заглавную букву
Вот функция, которая принимает пароль и говорит, соответствует ли он условиям (True
) или не соответствует (False
):
def has_capital_letter(string):
# Проверяет наличие хотя бы одной заглавной буквы в строке
def is_correct_password(password):
length = len(password)
return length > 8 and has_capital_letter(password)
print(is_correct_password('Qwerty')) # => False
print(is_correct_password('Qwerty1234')) # => True
print(is_correct_password('qwerty1234')) # => False
and
— означает «И». В математической логике это называют конъюнкцией. Все выражение считается истинным, если истинен каждый операнд — каждое из составных выражений. Иными словами, and
означает «и то, и другое». Приоритет этого оператора ниже, чем приоритет операторов сравнения. Поэтому выражение has_capital_letter(password) and length > 8
тоже правильно отрабатывает без скобок.
Кроме and
часто используется оператор or
— «ИЛИ» (дизъюнкция). Он означает «или то, или другое, или оба». Выражение a or b
считается истинным, если хотя бы один из операндов или одновременно все — истинные. В другом случае выражение ложное.
Операторы можно комбинировать в любом количестве и любой последовательности. Если в коде одновременно встречаются and
и or
, то приоритет задают скобками. Ниже пример расширенной функции, которая определяет корректность пароля:
def has_capital_letter(string):
# Проверяет наличие хотя бы одной заглавной буквы в строке
def has_special_chars(string):
# Проверяет содержание специальных символов в строке
def is_strong_password(password):
length = len(password)
# Скобки задают приоритет. Понятно, что к чему относится.
return (length > 8 and has_capital_letter(password)) and has_special_chars(password)
Теперь представим, что мы хотим купить квартиру, которая удовлетворяет таким условиям: площадь от 100 квадратных метров и больше на любой улице ИЛИ площадь от 80 квадратных метров и больше, но на центральной улице Main Street
.
Напишем функцию, которая проверит квартиру. Она принимает два аргумента: площадь — число и название улицы — строку:
def is_good_apartment(area, street):
return area >= 100 or (area >= 80 and street == 'Main Street')
print(is_good_apartment(91, 'Queens Street')) # => False
print(is_good_apartment(78, 'Queens Street')) # => False
print(is_good_apartment(70, 'Main Street')) # => False
print(is_good_apartment(120, 'Queens Street')) # => True
print(is_good_apartment(120, 'Main Street')) # => True
print(is_good_apartment(80, 'Main Street')) # => True
https://replit.com/@hexlet/python-basics-logic-logical-operators
Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже увидите таблицы истинности — по ним можно определить, каким будет результат, если применить оператора:
И and
A | B | A and B |
---|---|---|
True | True | True |
True | False | False |
False | True | False |
False | False | False |
ИЛИ or
A | B | A or B |
---|---|---|
True | True | True |
True | False | True |
False | True | True |
False | False | False |
Задание
Реализуйте метод is_leap_year()
, который определяет является ли год високосным или нет. Год будет високосным, если он кратен (то есть делится без остатка) 400 или он одновременно кратен 4 и не кратен 100. Как видите, в определении уже заложена вся необходимая логика, осталось только переложить её на код:
is_leap_year(2018) # false
is_leap_year(2017) # false
is_leap_year(2016) # true
Кратность можно проверять так:
# % - возвращает остаток от деления левого операнда на правый
# Проверяем что number кратен 10
number % 10 == 0
# Проверяем что number не кратен 10
number % 10 != 0
Упражнение не проходит проверку — что делать? 😶
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя 🤔
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно 🙄
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
Определения
Логические операторы — операторы «И» (
and
), ИЛИ (or
), позволяющие создавать составные логические условия.