Логические выражения. Урок 4

Основы программирования на Python

Логического выражения и логический тип данных

Часто в реальной жизни мы соглашаемся или отрицаем то или иное утверждение, событие, факт. Например, "Сумма чисел 3 и 5 больше 7" является правдивым утверждением, а "Сумма чисел 3 и 5 меньше 7" - ложным. Можно заметить, что с точки зрения логики подобные фразы предполагают только два результата: "Да" (правда) и "Нет" (ложь). Подобное используется в программировании: если результатом вычисления выражения может быть лишь истина или ложь, то такое выражение называется логическим.

На прошлом уроке были описаны три типа данных: целые, дробные числа, а также строки. Также выделяют логический тип данных. У этого типа всего два возможных значения: True (правда) — 1 и False (ложь) — 0. Только эти значения могут быть результатом логических выражений.

Логические операторы

Говоря на естественном языке (например, русском) мы обозначаем сравнение словами "равно", "больше", "меньше". В языках программирования используются специальные знаки, подобные тем, которые используются в математических выражениях: > (больше), < (меньше), >= (больше или равно), <= (меньше или равно).

Новыми для вас могут оказаться обозначение равенства: == (два знака "равно"); а также неравенства !=. Здесь следует обратить внимание на следующее: не путайте операцию присваивания, обозначаемую в языке Python одиночным знаком "равно", и операцию сравнения (два знака "равно"). Присваивание и сравнение — совершенно разные операции.

Примеры работы с логическими выражениями на языке программирования Python (после # написаны комментарии):

x = 125 # это не логическая операция, 
# а операция присваивания переменной x результата выражения 12 — 5
x == 4 # x равен 4
x == 7 # x равен 7
x != 7 # x не равен 7
x != 4 # x не равен 4
x  > 5 # x больше 5
x  < 5 # x меньше 5
x >= 6 # x больше или равен 6
x <= 6 # x меньше или равен 6

Определите устно результаты выполнения операций, приведенных в примере выше. Проверьте правильность ваших предположений, выполнив данные выражения с помощью интерпретатора языка Python.

Сложные логические выражения

Логические выражения типа verymuch >= 1023 является простым. Однако, на практике не редко используются более сложные. Может понадобиться получить ответа "Да" или "Нет" в зависимости от результата выполнения двух простых выражений. Например, "на улице идет снег или дождь", "переменная new больше 12 и меньше 20" и т.п.

В таких случаях используются специальные операторы, объединяющие два и более простых логических выражения. Широко используются два способа объединения: через, так называемые, логические И (and) и ИЛИ (or).

Чтобы получить истину (True) при использовании оператора and, необходимо, чтобы результаты обоих простых выражений, которые связывает данный оператор, были истинными. Если хотя бы в одном случае результатом будет False (ложь), то и все сложное выражение будет ложным.

Чтобы получить истину (True) при использовании оператора or, необходимо, чтобы результаты хотя бы одного простого выражения, входящего в состав сложного, был истинным. В случае оператора or сложное выражение становится ложным лишь тогда, когда ложны все составляющие его простые выражения.

Примеры работы со сложными логическими выражениями на языке программирования Python (после # написаны комментарии):

x = 8 
y = 13 
x == 8 and y < 15 #  x равен 8 и y меньше 15
x > 8 and y < 15 #  x больше 8 и y меньше 15
x != 0 or y >15 #  x не равен 0 или y больше 15
x < 0 or y >15 #  x меньше 0 или y больше 15

Определите устно результаты выполнения операций, приведенных в примере выше. Проверьте правильность ваших предположений, выполнив данные выражения с помощью интерпретатора языка Python.

Практическая работа

  1. Присвойте двум переменным любые числовые значения.
  2. Составьте четыре сложных логических выражения с помощью оператора and, два из которых должны давать истину, а два других - ложь.
  3. Аналогично выполните п. 2, но уже используя оператор or.
  4. Попробуйте использовать в сложных логических выражениях работу с переменными строкового типа.

Примерный результат выполнения практической работы

>>> num1 = 34
>>> num2 = 8.5
>>> num1 > 12 and num2 != 12
True
>>> num1 == 34 and num2 >= 8
True
>>> num1 != 34 and num2 != 12
False
>>> num1 <= 12 and num1 == 0
False
>>> num1 != 34 or num2 != 12
True
>>> num1 < 1 or num2 > 9.6
False
>>> str1 = "a"
>>> str2 = "b"
>>> str1 < "c" and str2 != "a"
True
>>> 

libreoffice calc? Даны три

libreoffice calc? Даны три действительных числа. Вывести на экран те из них Которые принадлежат интервалу [1, 3].

Не по теме, но от

Не по теме, но от души.

Большое Вам (plustilino) спасибо за Вашу работу и этот
чудесный сайт! Это первое место, где я нашел правильное
решение задач K&R и такое чудесное описание языка Python. Спасибо Вам еще раз. И еще о "хозяйке" сайта. Учитывая ее загрузку как педагога - поддержка этого сайта просто подвиг. Эта женщина просто умница. Она не только высокообразованный и увлеченный человек, но и педагог с Большой буквы. Очень поучительно и интересно почитать ее (plustilino) посты например, на хабрахаре - рекомендую всем, кто ценить ее как человека, учителя и просто женщину. Спасибо Вам еще раз. Рад (и без лишней лести), что знаком (жаль, что заочно) с таким интереснейшим человеком.

) Только вот из педагогики

) Только вот из педагогики она взяла и ливанула, о чем сообщила здесь.

x == 4 # x равен 4 Лучше

x == 4 # x равен 4
Лучше написать так:
If x == 4 # Если x равен 4

без if также вернет True.

без if также вернет True. Python "короче" других языков, если я ничего не путаю :)

Подскажите пожалусто как

Подскажите пожалусто как присвоить переменной x 2 возможных значения?
тоесть что б x был равен или 1 или 0 только

У меня в версии 2.7.2

У меня в версии 2.7.2 следующие результаты:
(при вставке на страницу сайта почему-то не коректно отображается сравнение меньше
поэтому здесь пишу словом)

>>> x=1
>>> x1="aa"
>>> x(меньше)x1 
True
>>> x>x1
False
>>> x=-999999
>>> x(меньше)x1
True
>>> x>x1
False
>>> x=9999999
>>> x(меньше)x1
True
>>> x>x1
False
 >>> x1='_1'
>>> x>x1
False
>>> x(меньше)x1
True
>>> x=1
>>> x='_1'
>>> x>x1
False
>>> x(меньше)x1
False
>>> x==x1
True  

Может кто-нибудь подсказать, какой принцип применяется для сравнения?

Ну судя по всему, строковый

Ну судя по всему, строковый тип данных всегда больше числового:

>>> int() < str()
True

Правило языка, скорее всего.

А вот Python 3 уже на попытку сравнения данных разного типа выдает ошибку:

>>> int() < str()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()
>>> "aa" < 89
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()

Спасибо, походу - до третей

Спасибо, походу - до третей версии прослеживается символьно-порядковая ранжировка.

>>> x='1'
>>> y=1
>>> x>y
True
>>> y='_1'
>>> x>y
False
>>> x(меньше)y
True
>>> x='a'
>>> y='b'
>>> x>y
False
>>> x='c'
>>> x>y
True
>>> y='c1'
>>> x>y
False 

в версии 3.4.0 тоже: >>> 'a'

в версии 3.4.0 тоже:

>>> 'a' > 'b'
False
>>> 'c' > 'b'
True
>>> 'd' > 'c'
True

Исправьте.

В примере ошибка небольшая =)
x = 8
y = 13
x == 8 and y < 15 # x равен 8 и y меньше 15
x > 8 and y < 15 # x больше 8 и y меньше 15
x != 0 or y >15 # x не равен 0 или y меньше 15 --> тут у больше 15
x < 0 or y >15 # x меньше 0 или y меньше 15 --> тут у больше 15

спасибо, исправлено

спасибо, исправлено

Операторы and и or

Если оператор and применяется к числам, то результатом является значение последнего операнда, если же применяется оператор or, то результатом выполнения является значение первого операнда. Вопрос: какой алгоритм используется Python в данной ситуации?

>>> 2 and 4
4
>>> 2 and 4 and -5
-5
>>> 2 or -4 or 5
2

"Борис, ты не прав!"

"Борис, ты не прав!" :-)

Если 1 операнд ложь, то в случае and он бдует результатом, если истина, то второй операнд не зависимо от его значения. Например:
>>> 0 and 5
0

При использовании or наоборот - даст первый операнд, если он истина и даст второй в любом другом случае. Пример:
>>> 1 or 0
1
>>> 0 or 'one'
'one'
>>>

имеено тот, который вы

имеено тот, который вы описали

Отличаются ли чем-то операции

Отличаются ли чем-то операции and и &, or и | ?

Да, отличаются. Причем & и |

Да, отличаются. Причем & и | в разных языках программирования могут обозначать разное. Например, в Python знак & может обозначать пересечение множеств, а | - их объединение, а также по отношению к целым числам побитовые операции ИЛИ и И.

Побитовые (&, |) и логические (and, or) операторы - разные вещи.

Каким образом сравниваются

Каким образом сравниваются строковые переменные с целочисленными???

>>>х=5
>>>х1='vu'
#почему
>>>x>x1
True
#и какое должно быть значение текстовой переменной, 
#чтобы результат стал False?

Python v3 на попытку

Python v3 на попытку стравнения строки с числом выдает ошибку. Python v2 - нет. Возможно, это просто особенности языков.
Пустая строка всегда False. Однако как пустая строка оценивается при сравнении разных типов сказать не могу.

Стоило бы уточнить

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

>>> print False or 5
5

Это на "подумать" ;) >>> x =

Это на "подумать" ;)

>>> x = True
>>> x
True

>>> x == 1
True
>>> x == 2
False
>>> x + 2
3

те переменнную можно инициализировать как True, но в зависимости от контекста операций она может проявлять себя как тип int. Не забываем, что Python язык с динамической типизацией...

И снова ты не прав :-) он

И снова ты не прав :-)
он выдает второй операнд, потому что первый "ложь", причем НЕ ЗАВИСИМО от того, что есть второй операнд. Кста - 5 - это True Ложь - это 0, пустая строка и спецобъект None.

Насчет равенства и присвоения

Насчет равенства и присвоения можно сказать так же, что в разных языках они обозначаются по разному, а не говорить, что начинающие программисты путают обозначения (хотя, конечно, путают)