Кроме арифметических операций, со школы нам известны операции сравнения. Например, 5 > 4
. Это звучит как вопрос: «5 больше 4?». В данном случае ответ «да». В других случаях ответом может быть «нет» (например, для 3 < 1
). Операции сравнения не имеют привязки к числам. Сравнивать можно практически всё что угодно, например, строки. Каждый раз, когда мы входим на какой-то сайт, внутри происходит сравнение введенных логина и пароля с теми, какие есть в базе. И только если они есть, нас пускают во внутрь (аутентифицируют).
Языки программирования адаптировали все математические операции сравнения практически в неизменном виде. Единственное серьезное отличие – операторы равенства и неравенства. В математике для этого используется обычное равно =
, но в программировании такое встречается не часто. Во многих языках символ =
используется для присваивания значений переменным, поэтому для сравнения в Python взяли ==
.
Список операций сравнения:
<
— меньше<=
— меньше или равно>
— больше>=
— больше или равно==
— равно!=
— не равноЭти операции применимы не только к числам. Например, с помощью оператора равенства можно сравнить строки: password == text
— это сравнение идентичности строк, записанных в разных переменных.
Логическая операция типа 5 > 4
или password == text
— это выражение, и его результат — специальное значение True
(«истина») или False
(«ложь»). Это новый для нас тип данных — bool
.
result = 5 > 4
print(result) # => True
print('one' != 'one') # => False
Наряду со строками (str
) и целыми и рациональными числами, тип bool
(булев) — это один из примитивных типов данных в Python.
Попробуем написать простую функцию, которая принимает на вход возраст ребёнка и определяет, младенец ли он. Младенцами считаются дети до года:
def is_infant(age):
return age < 1
print(is_infant(3)) # => False
Пользуемся тем фактом, что любая операция — это выражение, поэтому единственной строчкой функции пишем «вернуть то значение, которое получится в результате сравнения age < 1
». В зависимости от пришедшего аргумента, сравнение будет либо истинным (True
), либо ложным (False
), а return
вернёт этот результат.
А теперь проверим ребенка, которому полгода:
print(is_infant(0.5)) # => True
Функция is_infant()
— это функция-предикат (или функция-вопрос). Предикат отвечает на утвердительный вопрос «да» или «нет», возвращая значение типа bool. Предикаты во всех языках принято именовать особым образом для простоты анализа. В Python предикаты, как правило, начинаются с префикса is
или has
:
is_infant()
— «младенец ли?»has_children()
— «есть ли дети?»is_empty()
— «пустой ли?»has_errors()
— «есть ли ошибки?»Функция может считаться предикатом, только если она возвращает булевы значения True
или False
.
Давайте напишем еще одну функцию-предикат. Она принимает строку и проверяет, является ли она словом 'Castle'
:
def is_castle(string):
return string == 'Castle'
print(is_castle('Sea'))
Логические операции — это выражения. Значит, логические операции можно комбинировать с другими выражениями. Например, мы хотим проверить чётность числа, то есть кратность двум. В программировании используют такой подход: проверяют остаток от деления на 2:
Остаток от деления — простая, но очень важная концепция в арифметике, алгебре, и даже в теории чисел и криптографии. Идея проста: нужно разделить число на несколько равных групп, и если в конце что-то останется — это и есть остаток от деления.
Делим конфеты поровну между людьми:
Оператор %
вычисляет остаток от деления (не путайте с делением):
7 % 2
→ 1
21 % 3
→ 0
19 % 5
→ 4
Скомбинируем в одном выражении логический оператор ==
(проверка равенства) и арифметический оператор %
и напишем функцию проверки чётности:
def is_even(number):
return number % 2 == 0
print(is_even(10)) # => True
print(is_even(3)) # => False
Приоритет арифметических операций выше логических. Значит, сначала вычисляется арифметическое выражение number % 2
, затем результат участвует в логическом сравнении. По-русски это можно расшифровать так: «вычислить остаток от деления числа number
на 2 и сравнить, равен ли остаток нулю, затем вернуть результат проверки равенства».
Другой пример: напишем функцию, которая принимает строку и проверяет, начинается ли эта строка с латинской буквы a
.
Алгоритм:
a
.def is_first_letter_an_a(string):
first_letter = string[0]
return first_letter == 'a'
print(is_first_letter_an_a('orange')) # => False
print(is_first_letter_an_a('apple')) # => True
Попробуйте проговорить происходящее по-русски, аналогично тому, как мы расшифровывали процесс в примере с is_even()
в начале урока.
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт