Справочник по Python · модуль 2 · условия
Глава 2.1
Логический тип:
True, False и and, or, not
В этой главе разобран логический тип bool: два его значения, сравнения, которые их дают, и три операции — and, or, not, — которыми простые проверки соединяют в составные.
- Категория
- Синтаксис и базовые концепции
- Уровень
- Начальный
- Связанные темы
- Типы данных, условия, циклы
- Зачем это знать
- Строить проверки, на которых работает ветвление
§1Два значения: True и False
Логический тип (bool, от boolean) — тип данных с двумя значениями: True — истина и False — ложь. Такое значение хранит результат проверки. По нему программа выбирает, какие действия выполнять.
is_student = True is_working = False print(type(is_student)) # <class 'bool'>
Оба слова пишутся с заглавной буквы и без кавычек. True и False — значения языка, как 10 или 3.14.
Строчная запись true вызовет NameError: name 'true' is not defined: Python ищет переменную с таким именем и не находит. Запись "True" в кавычках — строка из четырёх букв, логическим значением она не является. В некоторых других языках эти слова пишут со строчной буквы. В Python верна только запись True и False.
§2Откуда берутся булевы значения
Чаще всего логическое значение получают как результат сравнения.
age = 20 print(age > 18) # True print(type(age > 18)) # <class 'bool'>
Выражение age > 18 вычисляется так же, как 2 + 3: Python подставляет значение переменной и получает результат. У сравнения результат — True или False. Операторов сравнения шесть:
| Оператор | Проверяет | Пример | Результат |
|---|---|---|---|
== | равно | 5 == 5 | True |
!= | не равно | 5 != 5 | False |
> | больше | 7 > 3 | True |
< | меньше | 7 < 3 | False |
>= | больше или равно | 5 >= 5 | True |
<= | меньше или равно | 4 <= 3 | False |
Знаки = и == обозначают разные операции. Один знак — присваивание: значение записывается в переменную. Два знака — сравнение: проверяется, равны ли значения.
§3bool — это подкласс int
В Python логический тип — подкласс целых чисел: True равно единице, False — нулю.
print(True + True) # 2 print(int(True)) # 1 print(int(False)) # 0
Функция print() выводит их словами True и False. Это свойство применяют для подсчёта: сумма логических значений равна количеству истинных среди них.
Функция bool() приводит к логическому типу любое значение. Ноль и пустая строка дают False, остальные числа и строки — True.
print(bool(0)) # False print(bool("")) # False — пустая строка print(bool(5)) # True print(bool("текст")) # True
§4Оператор and
Простые проверки соединяют в составные тремя логическими операциями. Первая, and (И), даёт True, только когда истинны оба условия.
| Выражение | Результат |
|---|---|
True and True | True |
True and False | False |
False and True | False |
False and False | False |
Такая таблица называется таблицей истинности: в ней перечислены все сочетания значений и результат для каждого. Пример из жизни: «пойду гулять, если будет тепло и не будет дождя». Если хотя бы одно условие не выполнено, всё выражение ложно.
age = 20 student = True print(age > 18 and student) # True
Здесь два условия: возраст больше 18 и человек является студентом. Оба дают True, поэтому всё выражение истинно.
§5Оператор or
Операция or (ИЛИ) даёт True, если истинно хотя бы одно из условий.
| Выражение | Результат |
|---|---|
True or True | True |
True or False | True |
False or True | True |
False or False | False |
temperature = 25 rain = False print(temperature > 20 or rain) # True
Результат истинный, потому что одно из условий выполнено: температура выше двадцати. Второе условие ложно: дождя нет. Оператору or достаточно одного истинного условия.
Оператор or отличается от разговорного «или». Фраза «чай или кофе» предполагает выбор одного из двух. Оператор or даёт True и в том случае, когда истинны оба условия. Условие «ровно одно из двух» разобрано в главе 2.2.
§6Оператор not
Операция not (НЕ) работает с одним значением и меняет его на противоположное.
| Выражение | Результат |
|---|---|
not True | False |
not False | True |
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.
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 Совершеннолетний: True Подходит на позицию: False Нужно обучение: True
Результат каждой проверки сохранён в переменную, имя которой называет её смысл. Выражение is_adult and is_experienced читается как фраза, а в записи age >= 18 and experience >= 3 нужно разбирать числа. Имена логических переменных обычно начинают с is_ или has_: по имени видно, что в переменной логическое значение.
§8Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
x = true | NameError — регистр имеет значение | x = True |
x = "True" | в переменной строка, а не логическое значение | x = True, без кавычек |
age = 18 вместо age == 18 | вместо сравнения выполнится присваивание | сравнение — это два знака: == |
age > 18 and < 65 | SyntaxError — у второго сравнения нет левой части | age > 18 and age < 65, а лучше 18 < age < 65 |
x = 5 and y = 3 | SyntaxError — присваивание внутри выражения | сначала присвоить, потом проверять |
0.1 + 0.2 == 0.3 | False — дробные числа хранятся неточно | сравнивать после округления: 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
True and True → True
True and False → False
True or False → True
False or False → False
not True → False
not False → True
not → and → or
# надёжнее — скобки
Итог главы
Логический тип хранит одно из двух значений — True или False. Чаще всего их получают как результат сравнения. Три операции соединяют простые проверки в составные: and требует истинности обоих условий, or достаточно одного, not меняет значение на противоположное. В главе 2.4 такие выражения станут условиями оператора if.