Логические выражения. Условная инструкция

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

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

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. Это позволяет формулировать сокращенные логические выражения. Например:

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.
Блок else необязателен (неполное ветвление). Отступы должны быть одинаковой длины в каждом блоке данной инструкции!
if0
Постановка задачи.
Программа 1. Неполное ветвление. Определить является ли число N кратным числу K.

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

if1Блок-схема к программе Пример 1

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

n = int(input("n = "))
k = int(input("k = "))
if n > k:
    print(1)
else:
    print(2)

if2Блок-схема к программе Пример 2

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

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

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

Программа 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("Ошибка!")

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

Программа 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)

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

Хотя наличие отступов и делает структуру программы яснее, тем не менее, вложенные условия (nested conditional) очень быстро затрудняют чтение программы, поэтому большую глубину вложенности следует избегать, например, использовать несколько последовательных условных инструкций как в следующей программе.
Программа 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 - Тернарная операция. Тернарной она называется потому, что в ней требуется наличие трех операндов:

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

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

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

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

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

Обратите внимание, что сокращенную форму здесь применять нельзя! Если тернарная операция входит в более сложное выражение, то, ввиду старшинства приоритета арифметических операций, её следует заключать в круглые скобки. Например:

width = 100 + (10 if margin == 10 else 0)

Тернарная операция имеет существенное отличие от условной инструкции: последнюю нельзя применять в выражениях с "=".

Вопросы

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

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

Домашнее задание

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

Добавить комментарий