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

ABA and B
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse

ИЛИ or

ABA or B
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse

Задание

Реализуйте функцию 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`), позволяющие создавать составные логические условия.
Как с вами связаться? 🙃

Команда проекта находится в телеграм-сообществе по ссылке https://ttttt.me/HexletLearningBot. Там можно задать любой вопрос и повлиять на проект

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "Обсуждение". Как правильно задать вопрос:

В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

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

Прочитал урок — ничего не понятно 🙄

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

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются

Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт

Loading...

Ваше упражнение проверяется по этим тестам

1import index
2
3
4def test1():
5    assert index.is_leap_year(2016)
6    assert index.is_leap_year(2000)
7    assert not index.is_leap_year(2017)
8    assert not index.is_leap_year(2018)
9    assert not index.is_leap_year(1900)
10

Решение учителя откроется через:

20:00
waiting_clock