Понятно, что без логических переменных и выражений, без логического типа (bool) в языке программирования не обойтись. Множество возможных значений этого типа максимально просто, - значений всего два - истина и ложь () true, false)). В языке Python есть, как и положено, логические константы и переменные, логические операции, функции и выражения. Для тех, кто знаком с логическим типом по работе с каким-либо языком программирования, либо из математики, многие способы работы с логическим типом в Python будут знакомы и понятны. Тем не менее в Python есть особенности, не характерные для математики и других языков программирования. Расширение возможностей логического типа, принятые в Python, на мой взгляд, в большинстве случаев контрпродуктивны из-за несоответствия интуитивному пониманию. Возможно поэтому в довольно популярной книге Марка Лутца "Изучаем Python", многократно переиздаваемой, содержащей более 1200 страниц текста, нет раздела, посвященного логическому типу данных, хотя строкам и арифметике уделяется большое внимание.
В языке Python есть две логические константы True и False типа bool. Логические константы являются первичными логическими выражениями. Первичными выражениями являются и логические функции, возвращающие значения типа bool. Этот же тип имеют выражения, представленные операциями отношения: <, >, <=, >=, ==, !=.
В большинстве языков программирования отношением, представляющим первичное логическое выражение, называют два арифметических выражения, соединенных знаком операции отношения, например, x1 > x2 или x1 % 2 != 0. Здесь x1 и x2 - переменные арифметического типа, например, int.
В языке Python понятие отношения расширено. Отношение - это последовательность арифметических выражений, соединенных знаками отношений. Конечно, переход от пары выражений к последовательности расширяет возможности, но делает программу менее интуитивно понятной и чреватой ошибками.
Давайте рассмотрим пример отношений, допустимых в языке Python:
# Логический тип
def test1():
# операции отношения и первичные логические выражения
x1 = 5; x2 = 3; x3 = 7; x4 = 12
p1 = x1 % 2 != 0
p2 = x1 > x2
p3 = x2 < x1 < x3
p4 = x1 > x2 < x3 != x4
p5 = (x1 > x2) and (x2 < x3) and (x3 != x4)
print(p1, p2, p3, p4, p5)
test1()
Результаты:
При вычислении p1, p2 используется привычное отношение - пара арифметических выражений, соединенных операцией отношения. Семантика привычна и понятна. Вначале вычисляются арифметические выражения, они затем сравниваются и результат имеет тип bool. При вычислении p3, p4 используется расширенная форма записи отношения, допустимая в Python. Полагаю, что такой формой записи пользоваться не следует. Эквивалентная, интуитивно понятная форма записи выражения для p4 показана при записи выражения p5. Запись длиннее, но понятнее, что является большим преимуществом.
Не строгое, но интуитивно понятное определение логического выражения таково: логическое выражение - это последовательность первичных логических выражений, объединенных скобками и знаками логических операций. Заметьте, что точно также можно определить понятие арифметического или строкового выражения. Разница лишь в задании первичных выражений и операций над ними.
Какие же логические операции применяются при построении логических выражений в логике, в языках программирования и, в частности, в Python?
Давайте совершим небольшой экскурс в основы логики. Логические операции - функции, определенные над логическими переменными, результат которых также имеет тип bool. Уникальной особенностью логических функций является существование базиса - конечного набора функций, позволяющего любую логическую функцию с любым числом переменных задать формулой (логическим выражением), использующим только функции базиса. Можно доказать, что таким базисом является набор из трех функций: отрицание, конъюнкция, дизъюнкция.
Отрицание (в Python существуют два варианта этой операции - not и ~) - это унарная операция, изменяющая значение аргумента на противоположное - True на False и обратно.
Конъюнкция, называемая также операцией И, логическим умножением, (в Python существуют два варианта этой операции - and и ) - это бинарная операция, истинная тогда и только тогда, когда оба операнда операции истинны.
Дизъюнкция, называемая также операцией ИЛИ, логическим сложением, (в Python существуют два варианта этой операции - or и |) - это бинарная операция, ложная тогда и только тогда, когда оба операнда операции ложны.
Эти операции имеют разный приоритет при вычислении логических выражений. Высший приоритет имеет операция отрицания, затем логическое умножение (конъюнкция), затем логическое сложение (дизъюнкция).
Из логики известно, что базис можно сократить до одной функции. Теоретически это интересно, но практически нецелесообразно из-за растущей сложности формул, задающих логическое выражение. Поэтому в языках программирования базис обычно расширяется, в него добавляется эквивалентность (в Python - это ==) и ее отрицание, операция, называемая Исключающее Или, сложение по модулю 2 (в Python - это ^). Таким образом базис логических функций, используемых в языке Python, состоит из 5 функций, три из которых существуют в двух вариантах.
Отметим одну важную особенность логических выражений. Числа сами по себе не являются первичными логическими выражениями, но в Python при построении логических выражений можно использовать числа в качестве первичных выражений. В этом случае арифметическое выражение, имеющее значение 0, интерпретируется как False, все остальные значения - True. Заметьте, арифметическое выражение в этом случае не обязательно имеет тип int, допустим любой арифметический тип. Таким образом понятие логического выражения в Python расширяется, - оно строится из первичных логических выражений, арифметических выражений, объединяя их скобками и знаками операций. Как следствие, операнды логических операций могут иметь как тип bool, так и арифметический тип. Это еще одна сложность, затуманивающая понимание логических операций, допустимых в Python. Особенно неприятно, когда операнды имеют разные типы. Еще одно следствие, - логическое выражение не обязательно имеет тип bool, - его значением может быть число арифметического типа.
Поговорим теперь о том, почему базисные логические операции существуют в двух вариантах. Это не является уникальной особенностью Python. Практически такая ситуация существует в большинстве языков программирования. Объясняется это тем, что в программировании логические выражения имеют не два, а три значения - истина, ложь, неопределенность. Неопределенность не есть признак ошибки, а признак некоторой распознаваемой ситуации. Поэтому вместо классической конъюнкции и дизъюнкции полезно иметь их варианты - условные операции, учитывающие возможность неопределенности операнда, не приводящие к возникновению ошибки в работе программы.
Есть еще одна причина, по которой полезно иметь логические операции в двух вариантах, один из которых предполагает выполнение логических операций над булевскими операндами, что соответствует классической логике, другой - предполагает выполнение операций над целыми числами, когда целое число рассматривается как строка битов, представляющих число в двоичной системе счисления. Тогда операция выполняется над соответствующими парами бит операндов, формируя новое число. Такая возможность позволяет эффективно решать целый ряд задач, возникающих в программировании. Обычная практика, когда операция применяется либо к целым числам, либо к булевским выражениям. В языке Python эти два способа работы смешиваются, что будет показано на примерах.
В языке Python также, как в C# и других языках программирования, операции: конъюнкция, дизъюнкция, отрицание существуют в двух вариантах. В первом варианте конъюнкция задается ключевым словом - AND, дизъюнкция - OR, отрицание - NOT. Конъюнкция и дизъюнкция в этом случае понимается как условная операция, - если первый операнд конъюнкции ложен, то второй операнд не проверяется и результат операции ложен. Аналогично, если первый операнд дизъюнкции истинен, то второй операнд не вычисляется и результат операции равен истине. Операции определены как над числами, так и над булевскими операндами. Если операнд число, то оно интерпретируется как булева переменная, имеющая значение False, если значение равно 0, и True в противном случае. Результат операции зависит от типа операндов. Если оба операнда имеют тип bool, то и результат будет этого же типа. Если оба операнда числа, то и результат будет арифметического типа. Если оба операнда
разного типа, то тип результата может быть как арифметическим, так и булевским. Семантика такова. Вначале вычисляется результат при интерпретации чисел как булевских переменных. Затем анализируется тип критического операнда, на основании которого принято решение. Это может быть первый операнд, если его значение False, или второй операнд в противном случае. Тип и значение результата совпадает с типом и значением критического операнда.
Семантика далеко не интуитивна. Нужно понимать, что не следует применять условные операции к числовым операндам. Эти операции предназначены для работы с булевскими операндами.
Пример
# Логические операции
def test2():
# Условная конъюнкция и дизъюнкция. Определены над булевскими операндами
x1 = 5; x2 = 3; x3 = 7
p1 = x1 < x2 and x3 > a
p2 = x1 > x2 or x3 > a
p3 = not p1 and p2
print(p1, p2, p3)
test2()
Результат:
Несмотря на то, что в операциях конъюнкции и дизъюнкции второй операнд не определен, поскольку не определено значение переменной a, результат операции равен False в первом случае и True - во втором. При изменении порядка операндов возникнет ошибка.
Пример:
def test3():
# Условная конъюнкция и дизъюнкция. Операнды разного типа
x1 = 5; x2 = 3; x3 = 7
p1 = x1 + x2 or x3 > a
p2 = x1 + x2 and x2 > x3
print(p1, p2)
test3()
Результат:
8 False
При вычислении p1 критическим является первый операнд (арифметическое выражение), поэтому результатом операции является число. При вычислении p2 критическим является второй операнд (булевское выражение), поэтому результатом является значение типа bool.
Безусловные операции
Рассмотрим теперь операции конъюнкции, дизъюнкции, отрицания, задаваемые знаками: , |, ~. Они также определены как над целыми, так и над операндами типа bool. В этом варианте операции конъюнкции и дизъюнкции, выполняемые над операндами булевского типа, являются классическими операциями, когда всегда вычисляются оба операнда. Если же оба операнда являются целыми числами, то эти операции выполняются над парами битов, представленных двоичной записью целых чисел. Результатом операции является целое число. Пример:
def test4():
# Безусловная конъюнкция и дизъюнкция.
# Определены над целыми и булевскими операндами
x1 = 5; x2 = 3; x3 = 7
#p1 = (x1 > x2) | (x3 > a)
p2 = x1 > x2 x3 > x2
p3 = (x1 > x2) (x3 > x2)
print(p2, p3)
test4()
Результат:
False True
В примере оператор присваивания значения переменной p1 закомментирован, поскольку его выполнение приводит к ошибке из-за неопределенности второго операнда. Обратите внимание, расстановка скобок играет важную роль. При вычислении значения p2, где скобок нет, вначале будет выполняться операция над целочисленными переменными x2 и x3, а потом будут поочередно выполняться операции сравнения. В результате переменная p2 получит значение False. При вычислении значения переменной p3 операция будет выполняться над булевскими значениями и результатом будет значение True.
Когда операндами операций ~, и | являются целые, то операции также, как и в языке C#, являются побитовыми операциями. Целые числа воспринимаются как числа в двоичной системе и операции выполняются над битами (парами бит) этих чисел.
Пример:
def test5():
# Безусловная конъюнкция и дизъюнкция.
# Определены над целыми операндами
x1 = 5 3
x2 = 5 | 3
x3 = 2 ** 100
x4 = 3 ** 100
x5 = x3 x4
x6 = x3 | x4
print (x1, x2)
print(x3)
print(x4)
print(x5)
print(x6)
test5()
Результат:
1 7 1267650600228229401496703205376 515377520732011331036461129765621272702107522001 1267650600228229401496703205376 515377520732011331036461129765621272702107522001
Заметьте, результат справедлив и для длинной арифметики.
Рассмотрим еще пример, демонстрирующий важность корректной расстановки скобок при выполнении операций и |, когда смешиваются булевские и целые типы.
Пример:
def test6():
# Безусловная конъюнкция и дизъюнкция.
# Определены над целыми и булевскими операндами
x1 = 5; x2 = 3; x3 = 7
p1 = x1 | x2 > x3
p2 = x1 | (x2 > x3)
p3 = x1 x2 > x3
p4 = x1 (x2 > x3)
print(p1, p2, p3, p4)
test6()
Результат:
False 5 False 0
Этот пример показывает, что когда один из операндов операций или | имеет арифметический тип, то операция выполняется над числами, интерпретируя булевский операнд как число 0 или 1.
В этом примере при вычислении p1 и p2 выражения рассматриваются как отношение над парой арифметических выражений. При вычислении p3 и p4 логические операции по сути рассматриваются как арифметические операции над числами.
Рассмотрим пример применения операции ^ - исключающее или, которая также, как и операции и |, определена как над числами, так и над булевыми операндами, имея аналогичную семантику,
def test7():
# Исключающее Или.
# Определена над целыми и булевскими операндами
x1 = 10; x2 = 12; x3 = 7; x4 = 11
y1 = x1 ^ x2; y2 = (x1 > x2) ^ (x3 < x4)
y3 = x1 ^ x2 > x3
y4 = x1 ^ (x2 > x3)
print(y1, y2, y3, y4)
test7()
Результаты:
При вычислении y1 операция выполняется над числами и результат - число. При вычислении y2 операция выполняется над булевскими выражениями и результат - булевское значение. В двух следующих выражениях один из операндов - это число, поэтому операция выполняется над числами. Выражение в y3 - это отношение, поэтому результат имеет булевский о тип. При вычислении значения y4 булевский операнд интерпретируется как число, результатом операции является число.
Наш последний пример в этом разделе демонстрирует, что операндами логических операций могут быть не только целые числа:
def test8():
# Операция and над числами и булевскими операндами
from fractions import Fraction
p1 = Fraction(3,5) and 6
p2 = 5.5 - 11 / 2 and 6
p3 = 5 and (6 > 5)
p4 = 5.5 - 11/2 and (6 > 5)
print(p1, p2, p3, p4)
test8()
Результаты:
Попробуйте самостоятельно объяснить, почему Python дает такие результаты.
Подводя итоги, можно отметить, что язык Python предоставляет большие возможности при записи логических выражений. Однако вряд ли разумно использовать весь спектр этих возможностей.
Настоятельно рекомендую:
And, Or и операцию Not., |, ~, ^ .Понятно, что без логических переменных и выражений, без логического типа (bool) в языке программирования не обойтись. Множество возможных значений этого типа максимально просто, - значений всего два - истина и ложь () true, false)). В языке Python есть, как и положено, логические константы и переменные, логические операции, функции и выражения. Для тех, кто знаком с логическим типом по работе с каким-либо языком программирования, либо из математики, многие способы работы с логическим типом в Python будут знакомы и понятны. Тем не менее в Python есть особенности, не характерные для математики и других языков программирования. Расширение возможностей логического типа, принятые в Python, на мой взгляд, в большинстве случаев контрпродуктивны из-за несоответствия интуитивному пониманию. Возможно поэтому в довольно популярной книге Марка Лутца "Изучаем Python", многократно переиздаваемой, содержащей более 1200 страниц текста, нет раздела, посвященного логическому типу данных, хотя строкам и арифметике уделяется большое внимание.
В языке Python есть две логические константы True и False типа bool. Логические константы являются первичными логическими выражениями. Первичными выражениями являются и логические функции, возвращающие значения типа bool. Этот же тип имеют выражения, представленные операциями отношения: <, >, <=, >=, ==, !=.
В большинстве языков программирования отношением, представляющим первичное логическое выражение, называют два арифметических выражения, соединенных знаком операции отношения, например, x1 > x2 или x1 % 2 != 0. Здесь x1 и x2 - переменные арифметического типа, например, int.
В языке Python понятие отношения расширено. Отношение - это последовательность арифметических выражений, соединенных знаками отношений. Конечно, переход от пары выражений к последовательности расширяет возможности, но делает программу менее интуитивно понятной и чреватой ошибками.
Давайте рассмотрим пример отношений, допустимых в языке Python:
# Логический тип
def test1():
# операции отношения и первичные логические выражения
x1 = 5; x2 = 3; x3 = 7; x4 = 12
p1 = x1 % 2 != 0
p2 = x1 > x2
p3 = x2 < x1 < x3
p4 = x1 > x2 < x3 != x4
p5 = (x1 > x2) and (x2 < x3) and (x3 != x4)
print(p1, p2, p3, p4, p5)
test1()
Результаты:
При вычислении p1, p2 используется привычное отношение - пара арифметических выражений, соединенных операцией отношения. Семантика привычна и понятна. Вначале вычисляются арифметические выражения, они затем сравниваются и результат имеет тип bool. При вычислении p3, p4 используется расширенная форма записи отношения, допустимая в Python. Полагаю, что такой формой записи пользоваться не следует. Эквивалентная, интуитивно понятная форма записи выражения для p4 показана при записи выражения p5. Запись длиннее, но понятнее, что является большим преимуществом.
Не строгое, но интуитивно понятное определение логического выражения таково: логическое выражение - это последовательность первичных логических выражений, объединенных скобками и знаками логических операций. Заметьте, что точно также можно определить понятие арифметического или строкового выражения. Разница лишь в задании первичных выражений и операций над ними.
Какие же логические операции применяются при построении логических выражений в логике, в языках программирования и, в частности, в Python?
Давайте совершим небольшой экскурс в основы логики. Логические операции - функции, определенные над логическими переменными, результат которых также имеет тип bool. Уникальной особенностью логических функций является существование базиса - конечного набора функций, позволяющего любую логическую функцию с любым числом переменных задать формулой (логическим выражением), использующим только функции базиса. Можно доказать, что таким базисом является набор из трех функций: отрицание, конъюнкция, дизъюнкция.
Отрицание (в Python существуют два варианта этой операции - not и ~) - это унарная операция, изменяющая значение аргумента на противоположное - True на False и обратно.
Конъюнкция, называемая также операцией И, логическим умножением, (в Python существуют два варианта этой операции - and и ) - это бинарная операция, истинная тогда и только тогда, когда оба операнда операции истинны.
Дизъюнкция, называемая также операцией ИЛИ, логическим сложением, (в Python существуют два варианта этой операции - or и |) - это бинарная операция, ложная тогда и только тогда, когда оба операнда операции ложны.
Эти операции имеют разный приоритет при вычислении логических выражений. Высший приоритет имеет операция отрицания, затем логическое умножение (конъюнкция), затем логическое сложение (дизъюнкция).
Из логики известно, что базис можно сократить до одной функции. Теоретически это интересно, но практически нецелесообразно из-за растущей сложности формул, задающих логическое выражение. Поэтому в языках программирования базис обычно расширяется, в него добавляется эквивалентность (в Python - это ==) и ее отрицание, операция, называемая Исключающее Или, сложение по модулю 2 (в Python - это ^). Таким образом базис логических функций, используемых в языке Python, состоит из 5 функций, три из которых существуют в двух вариантах.
Отметим одну важную особенность логических выражений. Числа сами по себе не являются первичными логическими выражениями, но в Python при построении логических выражений можно использовать числа в качестве первичных выражений. В этом случае арифметическое выражение, имеющее значение 0, интерпретируется как False, все остальные значения - True. Заметьте, арифметическое выражение в этом случае не обязательно имеет тип int, допустим любой арифметический тип. Таким образом понятие логического выражения в Python расширяется, - оно строится из первичных логических выражений, арифметических выражений, объединяя их скобками и знаками операций. Как следствие, операнды логических операций могут иметь как тип bool, так и арифметический тип. Это еще одна сложность, затуманивающая понимание логических операций, допустимых в Python. Особенно неприятно, когда операнды имеют разные типы. Еще одно следствие, - логическое выражение не обязательно имеет тип bool, - его значением может быть число арифметического типа.
Поговорим теперь о том, почему базисные логические операции существуют в двух вариантах. Это не является уникальной особенностью Python. Практически такая ситуация существует в большинстве языков программирования. Объясняется это тем, что в программировании логические выражения имеют не два, а три значения - истина, ложь, неопределенность. Неопределенность не есть признак ошибки, а признак некоторой распознаваемой ситуации. Поэтому вместо классической конъюнкции и дизъюнкции полезно иметь их варианты - условные операции, учитывающие возможность неопределенности операнда, не приводящие к возникновению ошибки в работе программы.
Есть еще одна причина, по которой полезно иметь логические операции в двух вариантах, один из которых предполагает выполнение логических операций над булевскими операндами, что соответствует классической логике, другой - предполагает выполнение операций над целыми числами, когда целое число рассматривается как строка битов, представляющих число в двоичной системе счисления. Тогда операция выполняется над соответствующими парами бит операндов, формируя новое число. Такая возможность позволяет эффективно решать целый ряд задач, возникающих в программировании. Обычная практика, когда операция применяется либо к целым числам, либо к булевским выражениям. В языке Python эти два способа работы смешиваются, что будет показано на примерах.
В языке Python также, как в C# и других языках программирования, операции: конъюнкция, дизъюнкция, отрицание существуют в двух вариантах. В первом варианте конъюнкция задается ключевым словом - AND, дизъюнкция - OR, отрицание - NOT. Конъюнкция и дизъюнкция в этом случае понимается как условная операция, - если первый операнд конъюнкции ложен, то второй операнд не проверяется и результат операции ложен. Аналогично, если первый операнд дизъюнкции истинен, то второй операнд не вычисляется и результат операции равен истине. Операции определены как над числами, так и над булевскими операндами. Если операнд число, то оно интерпретируется как булева переменная, имеющая значение False, если значение равно 0, и True в противном случае. Результат операции зависит от типа операндов. Если оба операнда имеют тип bool, то и результат будет этого же типа. Если оба операнда числа, то и результат будет арифметического типа. Если оба операнда
разного типа, то тип результата может быть как арифметическим, так и булевским. Семантика такова. Вначале вычисляется результат при интерпретации чисел как булевских переменных. Затем анализируется тип критического операнда, на основании которого принято решение. Это может быть первый операнд, если его значение False, или второй операнд в противном случае. Тип и значение результата совпадает с типом и значением критического операнда.
Семантика далеко не интуитивна. Нужно понимать, что не следует применять условные операции к числовым операндам. Эти операции предназначены для работы с булевскими операндами.
Пример
# Логические операции
def test2():
# Условная конъюнкция и дизъюнкция. Определены над булевскими операндами
x1 = 5; x2 = 3; x3 = 7
p1 = x1 < x2 and x3 > a
p2 = x1 > x2 or x3 > a
p3 = not p1 and p2
print(p1, p2, p3)
test2()
Результат:
Несмотря на то, что в операциях конъюнкции и дизъюнкции второй операнд не определен, поскольку не определено значение переменной a, результат операции равен False в первом случае и True - во втором. При изменении порядка операндов возникнет ошибка.
Пример:
def test3():
# Условная конъюнкция и дизъюнкция. Операнды разного типа
x1 = 5; x2 = 3; x3 = 7
p1 = x1 + x2 or x3 > a
p2 = x1 + x2 and x2 > x3
print(p1, p2)
test3()
Результат:
8 False
При вычислении p1 критическим является первый операнд (арифметическое выражение), поэтому результатом операции является число. При вычислении p2 критическим является второй операнд (булевское выражение), поэтому результатом является значение типа bool.
Безусловные операции
Рассмотрим теперь операции конъюнкции, дизъюнкции, отрицания, задаваемые знаками: , |, ~. Они также определены как над целыми, так и над операндами типа bool. В этом варианте операции конъюнкции и дизъюнкции, выполняемые над операндами булевского типа, являются классическими операциями, когда всегда вычисляются оба операнда. Если же оба операнда являются целыми числами, то эти операции выполняются над парами битов, представленных двоичной записью целых чисел. Результатом операции является целое число. Пример:
def test4():
# Безусловная конъюнкция и дизъюнкция.
# Определены над целыми и булевскими операндами
x1 = 5; x2 = 3; x3 = 7
#p1 = (x1 > x2) | (x3 > a)
p2 = x1 > x2 x3 > x2
p3 = (x1 > x2) (x3 > x2)
print(p2, p3)
test4()
Результат:
False True
В примере оператор присваивания значения переменной p1 закомментирован, поскольку его выполнение приводит к ошибке из-за неопределенности второго операнда. Обратите внимание, расстановка скобок играет важную роль. При вычислении значения p2, где скобок нет, вначале будет выполняться операция над целочисленными переменными x2 и x3, а потом будут поочередно выполняться операции сравнения. В результате переменная p2 получит значение False. При вычислении значения переменной p3 операция будет выполняться над булевскими значениями и результатом будет значение True.
Когда операндами операций ~, и | являются целые, то операции также, как и в языке C#, являются побитовыми операциями. Целые числа воспринимаются как числа в двоичной системе и операции выполняются над битами (парами бит) этих чисел.
Пример:
def test5():
# Безусловная конъюнкция и дизъюнкция.
# Определены над целыми операндами
x1 = 5 3
x2 = 5 | 3
x3 = 2 ** 100
x4 = 3 ** 100
x5 = x3 x4
x6 = x3 | x4
print (x1, x2)
print(x3)
print(x4)
print(x5)
print(x6)
test5()
Результат:
1 7 1267650600228229401496703205376 515377520732011331036461129765621272702107522001 1267650600228229401496703205376 515377520732011331036461129765621272702107522001
Заметьте, результат справедлив и для длинной арифметики.
Рассмотрим еще пример, демонстрирующий важность корректной расстановки скобок при выполнении операций и |, когда смешиваются булевские и целые типы.
Пример:
def test6():
# Безусловная конъюнкция и дизъюнкция.
# Определены над целыми и булевскими операндами
x1 = 5; x2 = 3; x3 = 7
p1 = x1 | x2 > x3
p2 = x1 | (x2 > x3)
p3 = x1 x2 > x3
p4 = x1 (x2 > x3)
print(p1, p2, p3, p4)
test6()
Результат:
False 5 False 0
Этот пример показывает, что когда один из операндов операций или | имеет арифметический тип, то операция выполняется над числами, интерпретируя булевский операнд как число 0 или 1.
В этом примере при вычислении p1 и p2 выражения рассматриваются как отношение над парой арифметических выражений. При вычислении p3 и p4 логические операции по сути рассматриваются как арифметические операции над числами.
Рассмотрим пример применения операции ^ - исключающее или, которая также, как и операции и |, определена как над числами, так и над булевыми операндами, имея аналогичную семантику,
def test7():
# Исключающее Или.
# Определена над целыми и булевскими операндами
x1 = 10; x2 = 12; x3 = 7; x4 = 11
y1 = x1 ^ x2; y2 = (x1 > x2) ^ (x3 < x4)
y3 = x1 ^ x2 > x3
y4 = x1 ^ (x2 > x3)
print(y1, y2, y3, y4)
test7()
Результаты:
При вычислении y1 операция выполняется над числами и результат - число. При вычислении y2 операция выполняется над булевскими выражениями и результат - булевское значение. В двух следующих выражениях один из операндов - это число, поэтому операция выполняется над числами. Выражение в y3 - это отношение, поэтому результат имеет булевский о тип. При вычислении значения y4 булевский операнд интерпретируется как число, результатом операции является число.
Наш последний пример в этом разделе демонстрирует, что операндами логических операций могут быть не только целые числа:
def test8():
# Операция and над числами и булевскими операндами
from fractions import Fraction
p1 = Fraction(3,5) and 6
p2 = 5.5 - 11 / 2 and 6
p3 = 5 and (6 > 5)
p4 = 5.5 - 11/2 and (6 > 5)
print(p1, p2, p3, p4)
test8()
Результаты:
Попробуйте самостоятельно объяснить, почему Python дает такие результаты.
Подводя итоги, можно отметить, что язык Python предоставляет большие возможности при записи логических выражений. Однако вряд ли разумно использовать весь спектр этих возможностей.
Настоятельно рекомендую:
And, Or и операцию Not., |, ~, ^ .Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.