Логический (булевский) тип. Операторы сравнения. Логические операторы.
Может принимать одно из двух значений True (истина) или False (ложь). В языке Python булевский тип данных обозначается как bool, для приведения других типов данных к булеву существует функция bool (), работающая по следующим соглашениям:
- строки: пустая строка — ложь, непустая строка – истина.
- числа: нулевое число — ложь, ненулевое число (в том числе и меньшее единицы) — истина.
- функции — всегда истина.
Для работы с алгеброй логики в Питоне кроме логического типа данных предусмотрены операторы сравнения «>» больше, «<» меньше, «==» равно (одиночное «=» зарезервировано за оператором присваивания), «!=» (можно и по-паскалевски «<>»), «>=» больше или равно, «<=» меньше или равно.
Таблица. Основные логические операции и выражения.
Операция | Описание |
x > y | Условие «больше» |
x < y | Условие «меньше» |
x == y | Условие равенства |
x != y | Условие неравенства |
not x | Логическое «НЕ» (отрицание) |
x and y | Логическое «И» (умножение). Чтобы выполнилось условие x and y, необходимо, чтобы одновременно выполнялись условия x и y. |
x or y | Логическое «ИЛИ» (сложение). Чтобы выполнилось условие x or y, необходимо, чтобы выполнилось одно из условий. |
x in A | Проверка принадлежности элемента x множеству (структуре) А. |
a < x < b | Эквивалентно (x > a) and (x < b). |
Вот простенькая программа, вычисляющая различные логические выражения:
x = 12 – 5
h1 = x == 4
h2 = x == 7
h3 = x != 7
h4 = x != 4
h5 = x > 5
h6 = x <5
print (h1, h2, h3, h4, h5, h6)
Её вывод:
False True False True True False
Как видим, сравнивать особенно по равенству/неравенству можно всё, что угодно, включая типы данных. Обратите внимание, что оператор присваивания имеет самый низкий приоритет, поэтому расстановка скобок вокруг логических операторов и операторов сравнения не требуется.
Из логических переменных и выражений можно строить более сложные (составные) логические выражения с помощью логических операторов: not(отрицание, логическое НЕ), or(логическое ИЛИ) и and(логическое И).
Выражение not A (где A – логическая переменная или выражение) истинно тогда, когда выражение A ложно, и ложно, когда A истинно.
Выражение A and B истинно, когда одновременно истинны выражения A и B. Если хотя бы одно из этих выражения (A или B) ложно, то A and B ложно.
Выражение A orB истинно, когда любое из выражений A или B истинно и ложно, когда оба исходных выражения ложны.
Правила работы логических операторов можно также задать с помощью таблиц истинности, в которых указывается истинность составного выражения, в зависимости от значений исходных простых выражений.
Составное логическое выражение может содержать сколько угодно логических операторов. При этом в первую очередь выполняются все операторы сравнения (<, >, =, <=, >=, <>), затем логические отрицания (not), затем логическое И (and) и в последнюю очередь логическое ИЛИ (or). Выражения могут содержать скобки, которые влияют на приоритетность выполнения операций.
A | Not A | A | B | A and B | A | B | A or B | ||
True | False | True | True | True | True | True | True | ||
False | True | True | False | False | True | False | True | ||
False | True | False | False | True | True | ||||
False | False | False | False | False | False |
С помощью логических операторов мы можем записать условие равенства сразу трех переменных: (x = y) and (y = z).
Классическая задача из курса алгебры логики: Трое друзей, болельщиков автогонок "Формула-1", спорили о результатах предстоящего этапа гонок.
— Вот увидишь, Шумахер не придет первым, — сказал Джон. Первым будет Хилл.
— Да нет же, победителем будет, как всегда, Шумахер, — воскликнул Ник. — А об Алези и говорить нечего, ему не быть первым.
Питер, к которому обратился Ник, возмутился:
— Хиллу не видать первого места, а вот Алези пилотирует самую мощную машину.
По завершении этапа гонок оказалось, что предположения двух друзей подтвердились, а предположения одного из трёх неверны. Кто выиграл этап гонки?
Решение. Введем обозначения для логических высказываний:
S — победит Шумахер; H — победит Хилл; А — победит Алези.
Реплика Ника "Алези пилотирует самую мощную машину" не содержит никакого утверждения о месте, которое займёт этот гонщик, поэтому в дальнейших рассуждениях не учитывается.
Зафиксируем высказывания каждого из друзей:
Джон: v1 = not S and H;
Ник: v2 = S and not A;
Питер: v3 = not H.
Учитывая то, что предположения двух друзей подтвердились, а предположения одного из трёх неверны, запишем логическую функцию:
f = v1 and v2 and not v3 or v1 and not v2 and v3 or
not v1 and v2 and v3
В алгебре логики существует возможность доказательства утверждения методом перебора. Утверждение истинно, если при подстановке любых значений переменных оно превращается в верное тождество. Этот метод перебора не слишком трудоемок, поскольку переменные могут принимать только значения False (0) и True (1).
Логическая функция от n аргументов может быть задана таблицей, в которой перечислены все возможные наборы из False и True длины n и для каждого из них рассчитано значение функции. Пусть эту таблицу нам автоматически составит программа на Python:
for S in (False, True):
for H in (False, True):
for A in (False, True):
v1 = not S and H
v2 = S and not A
v3 = not H
f = v1 and v2 and not v3 or v1 and not v2 and v3 or not v1 and v2 and v3
print(S, H, A, f)
Вывод программы:
False False False False
False False True False
False True False False
False True True False
True False False True
True False True False
True True False False
True True True False
Из таблицы видно, что заданное утверждение истинно (True в четвёртом столбце) только при S=True, H=False, A=False. Значит ответ на задачу: победил Шумахер.
Обратите внимание на отступы, Питон к ним чрезвычайно чувствителен. Дело в том, что в Питоне фактически нет операторных скобок типа begin/end (как в Паскале) или «{}» (как в Cи-подобных языках), их роль выполняют отступы (роль открывающейся скобки в некотором смысле выполняет «:»). Если последующая строчка сдвинута по отношению к предыдущей вправо — значит, то, что на ней написано, представляет собою блок (часть кода, которая сгруппирована и воспринимается как единое целое). Принято и очень рекомендуется делать по 4 пробела на каждый уровень вложенности. При работе в IDLE и Geany редактор сам поставит нужный отступ, если вы не забудете «:» в конце предыдущей строки, клавиша «Backspace» позволит вернуться на один уровень назад.
Форматирование — очень важный момент при программировании на Питоне. Если вы поставите хотя бы один лишний пробел в начале строки, программа вообще не запустится, выдав Indentation Error — ошибку расстановки отступов, указав на первую строку, где с точки зрения программного парсера возникла ошибка.
<== предыдущая лекция | | | следующая лекция ==> |
Геоинформационные технологии | | | Уравнений невязкой несжимаемой жидкости |
Дата добавления: 2016-02-16; просмотров: 1258;