Модуль 2 · Условия

Справочник по Python · модуль 2 · условия

Глава 2.1

2.1

Логический тип:
True, False и and, or, not

В этой главе разобран логический тип bool: два его значения, сравнения, которые их дают, и три операции — and, or, not, — которыми простые проверки соединяют в составные.

Категория
Синтаксис и базовые концепции
Уровень
Начальный
Связанные темы
Типы данных, условия, циклы
Зачем это знать
Строить проверки, на которых работает ветвление

§1Два значения: True и False

Логический тип (bool, от boolean) — тип данных с двумя значениями: True — истина и False — ложь. Такое значение хранит результат проверки. По нему программа выбирает, какие действия выполнять.

Pythonдва значения типа bool
is_student = True
is_working = False

print(type(is_student))   # <class 'bool'>

Оба слова пишутся с заглавной буквы и без кавычек. True и False — значения языка, как 10 или 3.14.

Записи true и "True"

Строчная запись true вызовет NameError: name 'true' is not defined: Python ищет переменную с таким именем и не находит. Запись "True" в кавычках — строка из четырёх букв, логическим значением она не является. В некоторых других языках эти слова пишут со строчной буквы. В Python верна только запись True и False.

§2Откуда берутся булевы значения

Чаще всего логическое значение получают как результат сравнения.

main.pyсравнение возвращает bool
age = 20

print(age > 18)          # True
print(type(age > 18))    # <class 'bool'>

Выражение age > 18 вычисляется так же, как 2 + 3: Python подставляет значение переменной и получает результат. У сравнения результат — True или False. Операторов сравнения шесть:

ОператорПроверяетПримерРезультат
==равно5 == 5True
!=не равно5 != 5False
>больше7 > 3True
<меньше7 < 3False
>=больше или равно5 >= 5True
<=меньше или равно4 <= 3False

Знаки = и == обозначают разные операции. Один знак — присваивание: значение записывается в переменную. Два знака — сравнение: проверяется, равны ли значения.

§3bool — это подкласс int

В Python логический тип — подкласс целых чисел: True равно единице, False — нулю.

main.pyTrue — это единица
print(True + True)     # 2
print(int(True))       # 1
print(int(False))      # 0

Функция print() выводит их словами True и False. Это свойство применяют для подсчёта: сумма логических значений равна количеству истинных среди них.

Функция bool() приводит к логическому типу любое значение. Ноль и пустая строка дают False, остальные числа и строки — True.

Pythonчто считается ложью
print(bool(0))         # False
print(bool(""))        # False — пустая строка
print(bool(5))         # True
print(bool("текст"))   # True

§4Оператор and

Простые проверки соединяют в составные тремя логическими операциями. Первая, and (И), даёт True, только когда истинны оба условия.

ВыражениеРезультат
True and TrueTrue
True and FalseFalse
False and TrueFalse
False and FalseFalse

Такая таблица называется таблицей истинности: в ней перечислены все сочетания значений и результат для каждого. Пример из жизни: «пойду гулять, если будет тепло и не будет дождя». Если хотя бы одно условие не выполнено, всё выражение ложно.

main.pyand в действии
age = 20
student = True

print(age > 18 and student)   # True

Здесь два условия: возраст больше 18 и человек является студентом. Оба дают True, поэтому всё выражение истинно.

§5Оператор or

Операция or (ИЛИ) даёт True, если истинно хотя бы одно из условий.

ВыражениеРезультат
True or TrueTrue
True or FalseTrue
False or TrueTrue
False or FalseFalse
main.pyor в действии
temperature = 25
rain = False

print(temperature > 20 or rain)   # True

Результат истинный, потому что одно из условий выполнено: температура выше двадцати. Второе условие ложно: дождя нет. Оператору or достаточно одного истинного условия.

Оператор or отличается от разговорного «или». Фраза «чай или кофе» предполагает выбор одного из двух. Оператор or даёт True и в том случае, когда истинны оба условия. Условие «ровно одно из двух» разобрано в главе 2.2.

§6Оператор not

Операция not (НЕ) работает с одним значением и меняет его на противоположное.

ВыражениеРезультат
not TrueFalse
not FalseTrue
main.pyотрицание условия
rain = False

print(not rain)          # True — дождя нет
print(not (5 > 3))       # False

Отрицание сравнения обычно заменяют обратным сравнением: вместо not (age < 18) пишут age >= 18. Оператор not удобен, когда результат проверки уже сохранён в переменной: not rain.

На полях: порядок операций

Приоритет у трёх операций разный: сначала выполняется not, затем and, затем or. Поэтому a or b and c означает a or (b and c). В выражениях с несколькими операциями ставьте скобки: порядок вычисления тогда виден без таблицы приоритетов.

§7Пример программы с проверками

Программа ниже использует сравнения и все три операции. Она выводит результаты проверок. В главе 2.4 такие же выражения станут условиями оператора if.

main.pyанкета
age = int(input("Ваш возраст: "))
experience = int(input("Стаж работы, лет: "))

is_adult = age >= 18
is_experienced = experience >= 3

print("Совершеннолетний:", is_adult)
print("Подходит на позицию:", is_adult and is_experienced)
print("Нужно обучение:", not is_experienced)
Вывод в терминалввели 20 и 1
Ваш возраст: 20
Стаж работы, лет: 1
Совершеннолетний: True
Подходит на позицию: False
Нужно обучение: True

Результат каждой проверки сохранён в переменную, имя которой называет её смысл. Выражение is_adult and is_experienced читается как фраза, а в записи age >= 18 and experience >= 3 нужно разбирать числа. Имена логических переменных обычно начинают с is_ или has_: по имени видно, что в переменной логическое значение.

§8Частые ошибки

Что написаноЧто произойдётКак правильно
x = trueNameError — регистр имеет значениеx = True
x = "True"в переменной строка, а не логическое значениеx = True, без кавычек
age = 18 вместо age == 18вместо сравнения выполнится присваиваниесравнение — это два знака: ==
age > 18 and < 65SyntaxError — у второго сравнения нет левой частиage > 18 and age < 65, а лучше 18 < age < 65
x = 5 and y = 3SyntaxError — присваивание внутри выражениясначала присвоить, потом проверять
0.1 + 0.2 == 0.3False — дробные числа хранятся неточносравнивать после округления: round(a + b, 2) == 0.3

§9Проверьте себя

Что выведет print(5 > 3) и какого типа будет результат?

True, тип bool. Сравнение — это выражение: оно вычисляется и превращается в одно из двух логических значений.

Каким будет результат True and False or True?

True. Сначала выполняется and: True and False даёт False. Затем False or True даёт True. То же выражение со скобками: (True and False) or True.

Почему print(True + True) выводит 2?

Потому что bool — подкласс int, и True равно единице. В арифметическом выражении логическое значение ведёт себя как число. На практике это свойство используют, чтобы посчитать количество истинных проверок.

Как записать проверку «возраст от 18 до 65 включительно»?

Двумя способами: age >= 18 and age <= 65 либо короче — 18 <= age <= 65. Вторая запись называется цепочкой сравнений, она разобрана в главе 2.3.

Задача для практики: пользователь вводит число. Выведите True, если оно чётное и положительное.

Два условия объединяются через and, чётность проверяется остатком из главы 1.8:

  • number = int(input("Число: "))
  • print(number % 2 == 0 and number > 0)

Понятнее будет с промежуточными именами: is_even = number % 2 == 0, is_positive = number > 0, а затем print(is_even and is_positive).

§10Шпаргалка

Два значения True # истина False # ложь # с заглавной, без кавычек
Сравнения == != > < >= <= # результат — bool
and — оба True and True → True True and False → False
or — хотя бы одно True or False → True False or False → False
not — наоборот not True → False not False → True
Приоритет not → and → or # надёжнее — скобки

Итог главы

Логический тип хранит одно из двух значений — True или False. Чаще всего их получают как результат сравнения. Три операции соединяют простые проверки в составные: and требует истинности обоих условий, or достаточно одного, not меняет значение на противоположное. В главе 2.4 такие выражения станут условиями оператора if.

Глава 2.1 · Логический тип: True, False и and, or, not · Справочник по Python Автор: Макаров Максим Николаевич