§6. Логический тип. Инструкция ветвления. Особенности синтаксиса python

Логический тип

Логический (булевский) тип в Python относится к целочисленному типу. Для преобразования к логическому типу используется стандартная функция bool(). Для этого типа определены всего две константы True (истина) и False (ложь).
Примечание. Обратите внимание, что и именах констант True и False первая буква – прописная.
Величину логического типа всегда можно получить в логическом выражении (boolean expression). Результатом логического выражения может быть одно из двух логических значений.

a = 5 > 2
print(a)
a = 7 != 7
print(a)
a = 4 <= 10
print(a)
a = 4 % 2 != 0
print(a)
a += 1
print(a)
Результат:
True
False
True
False
1

В python любое выражение отличное от нуля интерпретируется как True, а нулевое значение — как False (как в C и С++). Это позволяет формулировать сокращенные логические выражения. Например:

a = 4
b = not(a % 2)
print(b)

Результат:

True

Такой подход весьма привлекателен, но может привести к трудно уловимым ошибкам.
К логическим операциям относятся операции сравнения и логические операции.

Операции сравнения (отношения) и логические операции

К операциям сравнения относятся следующие операции:

  • < меньше
  • <= меньше либо равно
  • > больше
  • >= больше либо равно
  • != неравно
  • == равно
Эти операции имеют равный приоритет. Следовательно, включается ассоциативность (т. е. порядок вычисления) слева направо. Так выражение:

print(4 > 3 <= 7 != 3 < 2)

приведет к значению False.
Это отличает python от других языков программирования в которых эти операции имеют разный приоритет. Поэтому, в python возможны цепочечные сравнения вида:

a < b <= c

И, следовательно, можно избежать в логических выражениях использование логических операций. (Последнее выражение будет эквивалентно a < b and b <= c)
Очень распространенной ошибкой является использование "=", вместо "==".

Логические операции

В отличие от операций сравнения, логические операции имеют разный приоритет (сверху вниз, по убыванию):

  • or логическое "или"
  • and логическое "и"
  • not логическое "не"
но более высокий, чем операции сравнения. Следовательно, в выражениях с операциями сравнения, для изменения порядка вычислений, необходимо использовать скобки.
В python используются "ленивые вычисления". Так, в следующем выражении, если первый операнд True, а это так, то вычисление оставшейся часть будет опущено, поскольку для операции or нет смысла производить дальнейшее вычисления логического значения:

print(4 > 3 or 3 < 2 and 4 == 5)

Но инструкция:

print((4 > 3 or 3 > 2) and 4 == 5)

даст результат False, поскольку скобки потребуют вычисления второго операнда для and, а он дает ложь.
Некоторые выражения можно записать более лаконично, используя правила булевой алгебры:

not x and not y

эквивалентно

not (x or y)

(объясните - почему?)

Инструкция ветвления if

Инструкция if является инструкцией управления, реализующая алгоритмическую структуру "ветвление". Синтаксически это выглядит так:

if <логическое выражение>:
    <блок операций 1>
else:
    <блок операций 2>

Отступы (например, табуляция) обязательны в блоках if и else. Отступы должны быть одинаковой символьной длины, т. е. это либо табуляция, либо (например) 4 символа пробела. Для совместимости кода, не следует использовать в оформлении блоков смешанные символы (табуляции и пробела). Python имеет самобытный синтаксис в котором отступы - часть строгого синтаксиса. Нарушение этих правил приведет к синтаксической ошибке. Отступы являются ограничителями блока. Блоком называется инструкция или группа инструкций, которые выполняются как одна в инструкциях управления: if, for, while, def и др. Среды программирования, такие ка PyCharm, создают отступы в определённых участках кода автоматически.
Блок else является необязательным (неполное ветвление).

Постановка задачи.
Программа 6.1 Неполное ветвление. Определить является ли число N кратным числу K.

N = int(input("N = "))
K = int(input("K = "))
if N % K == 0: 
    print(N, "кратно", K)

Блок-схема к программе 6.1

Программа 6.2 Полное ветвление. Введены два числа. Определить порядковый номер большего из них.

a = int(input("a = "))
b = int(input("b = "))
if a > b:
    print(1)
else:
    print(2)

Блок-схема к программе 6.2

Инструкции if вложенные друг в друга

Поскольку конструкция if else воспринимается как одна инструкция, то она может входить внутрь другой условной инструкции, создавая, таким образом, структуру вложенного ветвления. Для более удобного представления блоков вместо else if ... ("иначе если") используется сокращение elif. В более общем виде синтаксис условной инструкции принимает вид:

if <логическое выражение1>:              
    <блок операций 1>            
elif <логическое выражение2>:            
    <блок операций 2>            
elif <логическое выражение3>:            
    <блок операций 3>            
...              
elif <логическое выражениеN>:            
    <блок операций N>            
else:            
    <блок операций N+1>

Программа 6.3 Дано целое число K. Вывести строку-описание оценки, соответствующей числу K (1 — «плохо», 2 — «неудовлетворительно», 3 — «удовлетворительно», 4 — «хорошо», 5 — «отлично»). Если K не лежит в диапазоне 1–5, то вывести строку «ошибка».

k = int(input("k = "))       
if k == 1 : print("Плохо")
elif k == 2 : print("Неуд.")
elif k == 3 : print("Удовл.")
elif k == 4 : print("Хор.")
elif k == 5 : print("Отлично")
else : print("Ошибка!")

Блок-схема к программе 6.3

Программа 6.4 Вложенное ветвление. Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной большее из этих значений, а если равны, то присвоить переменным нулевые значения. Вывести новые значения переменных A и B.

a = int(input("a = "))       
b = int(input("b = "))       
if a != b :
    if a > b:
        b = a        
    else:        
        a = b        
else:
    a = b = 0       
print("a =", a, ", b =", b)

Блок-схема к программе 6.4

Хотя наличие отступов и делает структуру программы яснее, тем не менее, вложенные условия (nested conditional) очень быстро затрудняют чтение программы, поэтому большую глубину вложенности следует избегать, например, использовать несколько последовательных условных инструкций как в следующей программе.
Программа 6.5 Каскадные условные инструкции. Даны три целых числа. Найти количество положительных чисел в исходном наборе.

a = int(input("a = "))       
b = int(input("b = "))       
c = int(input("c = "))       
i = 0       
if a > 0: i += 1     
if b > 0: i += 1     
if c > 0: i += 1
print("Количество положительных чисел равно", i)

Тернарная операция

В python, как и в других языках программирования, существует альтернатива инструкции if - Тернарная операция. Строго говоря, в python нет тернарной операции. Это все та же инструкция управления, но представленная в необычной форме. Тернарная она называется потому, что в ней требуется наличие трех операндов:

a = <выражение_1> if <логическое выражение> else <выражение_2>

В этой инструкции переменная a будет ссылаться на значение выражения выражение_1, если логическое выражение истинно, в противном случае a будет ссылаться на значение выражение_2.
Тернарная инструкция позволяет перефразировать инструкцию if в более лаконичной форме. Например, инструкцию:

if a % 2 == 0:
   i+=1
else:
   i*=2

можно заменить на такую:

i += 1 if not(a % 2) else i * 2

Если тернарная инструкция входит в более сложное выражение, то, ввиду старшинства приоритета арифметических операций, её следует заключать в круглые скобки. Например:
width = 100 + (10 if margin == 10 else 0)
Если бы не было скобок, то при значении margin не равным 10, значением width равнялось бы 0.
Тернарная инструкция имеет существенное отличие от обычной условной инструкции: последнюю нельзя применять в выражениях с "=".

Вопросы
  1. Объясните почему условие 10 < x < 0 никогда не будет истинным.
  2. Приведите свои примеры ленивых вычислений для or и and; ответ обоснуйте.
  3. Тернарную операцию можно представить также в виде выражения с or и and. Например:
    test = True
    result = test and 'Test is True' or 'Test is False'

    Объясните, почему? (Такая форма ближе к тернарной инструкции в стиле С++)

Домашнее задание
  1. Даны три действительных числа. Возвести в квадрат те из них, значения которых неотрицательны, и в четвертую степень - отрицательные
  2. Даны две точки A(x1, y1) и B(x2, y2). Составить программу, определяющую, которая из точек находится ближе к началу координат.
Print Friendly, PDF & Email

Comments are closed