[ Сборник задач ]
Тема 3. Логический тип
данных

[ Сборник задач ]
Тема 3. Логический тип
данных

Python Workbook Cover T3
Тип данных: bool
Контент: Вопросы (7шт) + задачи (4шт)

Оглавление

1
Введение
Поговорим о том, что такое логический тип данных, какими свойствами он обладает и какие операции можно к нему применять.
Перейти
2
Вопросы и ответы
7 вопросов по теме "Логический тип данных" + ответы
Перейти
3
Условия задач
4 задачи по теме двух уровней сложности: Базовый и *Продвинутый
Перейти
4
Решения задач
Приводим код решений указанных выше задач
Перейти
1
One

Введение

В логическом (булевом) типе данных имеется 2 значения: True («правда») и False («ложь»). Детальное описание этого типа дано в стандарте PEP-285.

Класс bool – это подкласс типа int (т.е. целых чисел). True и False – синглтон-объекты, которые по ходу выполнения программы никогда не меняют место расположения в памяти.

К логическим объектам можно применять математические операции. Есть 3 типа логических операторов: not («не»), or («или»), and («и»).

Операции с логическим типом данных обладают свойствами: коммутативность, дистрибутивность, ассоциативность; к ним применимо правило де Моргана.

Читайте также

2
Two

Вопросы по теме "Логический тип данных"

1. В чем разница между выражениями: True == 1 и True is 1? Какие результаты получим при их вычислении?

Когда мы пишем True == 1, то сравниваем значения. Так как класс bool является подклассом целых чисел, то True в данном случае будет той же самой единицей.
Когда задается выражение True is 1, то сравниваются адреса в памяти. Так как логические данные являются синглтон-объектами, то у них имеется собственный адрес в памяти, который не меняется по ходу работы скрипта. Поэтому число 1 и True – занимают разные области в памяти.

Решение – Интерактивный режим
>>> True == 1
True
>>> True is 1 # Сравниваются ячейки памяти
False
>>> id(True), id(1)
(2078150976, 2078275504) # Как видим – разные адреса в памяти

2. В чем смысл дистрибутивности логических выражений?
Дистрибутивность связана с раскрытием скобок в логических выражениях.
Она определяется следующими правилами:

A and (B or C) == (A and B) or (A and C)
A or (B and C) == (A or B) and (A or C)

Примеры – Интерактивный режим
>>> True and (False or True) == (True and False) or (True and True)
True
>>> True or (False and True) == (True or False) and (True or True)
True
3. Если сравнивать 2 логических объекта оператором or, то какие значения могут быть получены в итоге? Проиллюстрируйте ответ.

При сравнении двух булевых значений оператором or можно получить 4 варианта ответов. Только в одном случае будет False.

Примеры – Интерактивный режим
>>> True or True
True
>>> False or True
True
>>> False or False
False
>>> True or False
True

4. Какие объекты в Python всегда возвращают булево значение False?

Если применить функцию bool() к большинству объектов в Python, то получим True. Все возможные исключения представлены ниже:

1. False

Пример – Интерактивный режим
>>> bool(False)
False


2. None

Пример – Интерактивный режим
>>> bool(None)
False


3. 0
Пример – Интерактивный режим
>>> bool(0)
False


4. Пустые последовательности (строки, списки, кортежи и т.д.)

Примеры – Интерактивный режим
>>> bool('')
False
>>> bool([])
False
>>> bool({})
False


Также, можно принудительно внедрить метод __bool__() с возвращаемым значением False в любой класс.
5. Почему следует избегать выражений типа «a and not b or not c and d or e»? Как его модифицировать для удобочитаемости?

Компьютер способен выполнять и еще более сложные выражения. А вот человеку, читающему такой код, будет очень сложно понять, каков порядок вычисления значений.
Если при написании программы приходится использовать такую конструкцию, то ее нужно обернуть в скобки в порядке выполнения. Это существенно упростит понимание выражения:

((a and not b) or (not c and d)) or e.

Приведем пример, доказывающий идентичность выражений.

Пример – Интерактивный режим
>>> 1 and not 2 or not 3 and 0 or 4
4
>>> ((1 and not 2) or (not 3 and 0)) or 4
4

6*. Поясните различие между выражениями: "a and b" и "bool(a) and bool(b)".

Выражение bool(a) and bool(b) всегда вернет булево значение (т.е. True или False).
Выражение a and b возвращает последнее истинное значение или первое ложное (остальные выражения даже не будут вычисляться в этом случае).

Примеры – Интерактивный режим
>>> bool(7) and bool('Программирование')
True
>>> bool(7) and bool('')
False
>>> 7 and []
[]
>>> 7 and 44
44
>>> 1 and []
[]
>>> None and 11
None

7*. Определите приоритет выполнения операций при использовании булевых операторов.
Булевы операции выполняются слева направо в таком приоритете:
– в первую очередь рассчитываются выражения с оператором not;
– далее вычисляют все конструкции, имеющие оператор and;
– в последнюю очередь работаем с or.

Приведем пример вычисления выражения a or b and not c:
2 or 3 and not 1.
Вначале узнаем результат операции not 1: False.
Далее сравниваем 3 и False: 3 and False = False.
Последний шаг: 2 or False = 2.

Пример – Интерактивный режим
>>> 2 or 3 and not 1
2

3
Three

Задачи по теме "Логический тип данных"

4
Two

Решения

Задача 1. Базовый уровень

Условие
Напишите функцию dislike_6(a), которая всегда возвращает True, если только не передается число 6 типа int или типа float (в данном случае она вернет «Только не 6!»).
Вначале проверяем, является ли аргумент целым или вещественным числом. Если это так и он равен 6 или 6.0, то вернем «Только не 6!» Во всех остальных случаях результат представлен в виде True.
Решение – IDE
def dislike_6(a):
    if (type(a) is float or type(a) is int) and a == 6.0:
        return 'Только не 6!'
    return True

# Тесты
print(dislike_6(6.0))
print(dislike_6(6))
print(dislike_6('6'))
print(dislike_6('Хорошо'))
print(dislike_6([6, 6]))
Результат выполнения
Только не 6!
Только не 6!
True
True
True

Задача 2. Базовый уровень

Условие
Изучающий язык Python студент постоянно путается в свойствах логических операций (ассоциативность, дистрибутивность, коммутативность, правило де Моргана). 
Он решил написать функцию-подсказку help_bool(letter), которая принимает одну из 4 букв: к, а, д, м (соответствующую каждому свойству). 
Результат выполнения: определенное правило работы в виде строки.
Если будет передано что-то иное, то вернется подсказка-строка с пояснением по каждому возможному аргументу.
Охарактеризуем каждое правило:

– Коммутативность (к)
A or B = B or A
A and B = B and A


– Дистрибутивность (д)
A and (B or C) == (A and B) or (A and C)
A or (B and C) == (A or B) and (A or C)


– Ассоциативность (а)
A or (B or C) == (A or B) or C == A or B or C
A and (B and C) == (A and B) and C == A and B and C


– Теорема Де Моргана (м)
not (A or B) == not A and not B
not (A and B) == not A or not B
not (A < B) == A >= B
not (not (A)) = A


Если пользователь забудет нужный аргумент, то дадим ему подсказку:
Возможные аргументы: к – Коммутативность, д – Дистрибутивность, а – Ассоциативность, м – Теорема Де Моргана. Можем даже принудительно задать параметр по умолчанию, который без верного аргумента будет возвращать подсказку.
Решение - IDE
def help_bool(letter=None):
    if letter == 'к':
        return 'A or B = B or A\nA and B = B and A'
    elif letter == 'а':
        return 'A or (B or C) == (A or B) or C == A or B or C\n' \
               'A and (B and C) == (A and B) and C == A and B and C'
    elif letter == 'д':
        return 'A and (B or C) == (A and B) or (A and C) \nA or (B and C) == (A or B) and (A or C)'
    elif letter == 'м':
        return 'not(A or B) == not A and not B \nnot(A and B) == not A or not B\n'\
               'not(A < B) == A >= B\nnot(not(A)) = A'
   else:
        return 'Возможные аргументы: к – Коммутативность, д – Дистрибутивность, а – Ассоциативность, ' \
           'м – Теорема Де Моргана'

# Тесты
print(help_bool())
print(help_bool([2, 6]))
print(help_bool('к'))
Результат выполнения
Возможные аргументы: к – Коммутативность, д – Дистрибутивность, а – Ассоциативность, м – Теорема Де Моргана 
Возможные аргументы: к – Коммутативность, д – Дистрибутивность, а – Ассоциативность, м – Теорема Де Моргана 
A or B = B or A
A and B = B and A

Задача 3. *Продвинутый уровень

Условие
Дано 2 скрипта. В первом – возникает ошибка, во втором – ошибки нет. 
Поясните почему.

Скрипт 1.
a = None
if len(a) > 0 and a is not None:
    print('OK')                        

Скрипт 2.
a = None
if a is not None and len(a) > 0:
    print('OK')
Применение оператора and к выражениям останавливается тогда, когда обнаруживается первое ложное значение. None – ложное значение, поэтому оно сразу возвращается, без вычисления второй половины выражения во втором скрипте.

В первом же примере мы пытаемся найти длину None, а такого свойства у значения нет. Поэтому возникает ошибка.
Решение – IDE
a = None
if a is not None and len(a) > 0:
    print('OK')

a = 'Нет ошибок'
if a is not None and len(a) > 0:
    print('OK')
Результат выполнения
– первое выражение будет проигнорировано
– второе выражение напечатает 'OK'.
Решение – IDE
a = None
if len(a) > 0 and a is not None:
    print('OK')
Результат выполнения
TypeError (ошибка типа).

Задача 4. *Продвинутый уровень

Условие
После изучения темы «Логический тип в Python» перед учеником стала задача написать функцию divider(a, b), принимающую любые 2 числовых параметра. 
Задача функции: разделить a на b. 
Если в знаменателе введут ноль, то результат будет следующим: «Нули в знаменателе не приветствуются». 
В противном случае выводится итог деления чисел, возведенный в куб.
Решите задание без использования условия if, применяя свойства логических операторов.
Для решения задачи необходимо вспомнить о свойствах операторов and, or.
Если решать задание «в лоб», то оно очень простое.
Решение – IDE
def divider(a, b):
    if b == 0:
        return 'Нули в знаменателе не приветствуются'
    return (a / b) ** 3
Однако требуется не использовать условия.
Решение – IDE
def divider(a, b):
    return b and (a / b) ** 3 or 'Нули в знаменателе не приветствуются'

# Тесты
print(divider(10, 4))
print(divider(10, 0))
print(divider(-12.2, 2))
print(divider(-6.4, 0))
Результат выполнения
15.625
Нули в знаменателе не приветствуются
-226.98099999999997
Нули в знаменателе не приветствуются
Как вам материал?

Читайте также