Алгебра логики. Пустые и непустые объекты
Повторение:
- Условие — это «просто выражение»
- Условный оператор — делать или не делать что-то в зависимости от условия
- блок операторов
клаузы else: и elif:
Вложенность составных операторов (пока мы знаем только if)
Булева алгебра
В императивном языке программирования обычно используется только Логика высказываний.
Житейское обоснование алгебры логики:
Некоторое утверждение либо истинно, либо ложно, третьего не дано
- Относительно утверждений можно делать следующие заявления, результат которых также строго либо истина, либо ложь
И: «все утверждения истинны»
ИЛИ: «хотя бы одно утверждение истинно» ( не «ровно одно» )
НЕ: «утверждение ложно»
Python:
Мы оперируем только с результатами проверки утверждений — True или False, т. е. объектами типа bool
⇒ or, and и not — такие же операции, как операции сравнения или арифметические. Приоритет у них ещё ниже, скобки не нужны. Приоритет самих этих трёх операций разный, not повыше, or — пониже.
Ввести три числа и проверить, что и сумма, и произведение первых двух не превосходят третье
- Скобки нужны, как и в арифметике, для изменения приоритетов:
Разумеется, можно использовать арифметические выражения:
Ввести три числа и проверить неравенство треугольника: сумма любых двух должна быть больше оставшегося третьего. Если треугольник возможен, вывести ДА, а если нет --- НЕТ.
Кстати, удобные многоместные сравнения вида a < b < c:
Таблицы истинности
Одноместная (унарная) операция над bool:
A
not A
False
True
True
False
Двухместные (бинарные) операции bool:
or
and
A
B
A or B
A
B
A and B
False
False
False
False
False
False
False
True
True
False
True
False
True
False
True
True
False
False
True
True
True
True
True
True
Свойства:
- OR
если A истинно, результат в любом случае истинен, вычислять B не надо
- AND
если A ложно, результат в любом случае ложен, вычислять B не надо
Ленивые вычисления
Python так и поступает!
1 >>> a, b = 2, 3
2 >>> if b != 0 and a/b > 0.5:
3 ... print(a, "почти равно", b)
4 ... else:
5 ... print(a, "совсем не равно", b)
6 2 почти равно 3
7 >>> a, b = 2, 0
8 >>> if b != 0 and a/b > 0.5:
9 ... print(a, "почти равно", b)
10 ... else:
11 ... print(a, "совсем не равно", b)
12 2 совсем не равно 0
13 >>> a/b
14 Traceback (most recent call last):
15 File "<stdin>", line 1, in <module>
16 ZeroDivisionError: division by zero
17
18 division by zero
19
Пустые объекты
Тема необязательная, но если её не знать, непонятно, почему Python не выдаёт ошибку в таком случае:
Дело в том, что условие в Python — это объект, результат вычисления выражения, который считается «ложью», если объект пустой и «истиной», если объект непустой. Все объекты либо пусты, либо нет!
Пересмотрим таблицы истинности для or и and:
- OR
если A истинно, результат в любом случае истинен, вычислять B не надо. В качестве ответа можно вернуть само A. Если A ложно, ответ совпадает с истинностью или ложностью B.
Иначе говоря, or — это «если A непусто, то A, иначе B»
- AND
если A ложно, результат в любом случае ложен, вычислять B не надо. В качестве ответа можно вернуть само A. Если A истинно, ответ совпадает с истинностью или ложностью B.
Иначе говоря, and — это «если A пусто, то A, иначе B»
or
and
A
B
A or B
A
B
A and B
Пусто
Пусто
B
Пусто
Пусто
A
Пусто
Непусто
B
Пусто
Непусто
A
Непусто
Пусто
A
Непусто
Пусто
B
Непусто
Непусто
A
Непусто
Непусто
B
Не, ну правда же:
P.S. Чтобы не запутаться, лучше всё-таки пользоваться True и False. Но зато так веселее! Небинарная логика, вот это всё…
Д/З
Дощёлкать Второе занятие учебника целиком
- Решить 6 последних задач ко второму занятию (начиная от «ходя короля»)
Прислать шесть файлов с решениями в виде шести приложений к одному письму по адресу <uneexlectures AT cs DOT msu DOT ru>
Имена файлов: от prog_2_8.py до prog_2_13.py
В поле Subject должно быть «слово» PhilosoPython2022 (заглавные буквы имеют значение другие слова тоже можно ☺)