Что является результатом действия логического оператора or
Перейти к содержимому

Что является результатом действия логического оператора or

  • автор:

ЛОГИЧЕСКИЕ ОПЕРАТОРЫ В PYTHON

Логические операторы используются для объединения нескольких операторов сравнения. Существуют три логических оператора: or (ИЛИ), and (И), not (НЕ).

Логический оператор «or»

Возвращает True, если хотя бы одно из сравнений истинно. Если оба сравнения ложны, то результат операции будет False.

a = 5 > 7 or 2 < 3 print(a) 
True

Логический оператор "and"

Возвращает True, если оба сравнения истинны. Если хотя бы одно из сравнений ложно, то результат операции будет False.

a = 5 > 7 and 2 < 3 print(a) 
False

Логический оператор "not"

Инвертирует результат сравнения. Если сравнение истинно, то результат операции будет False. Если сравнение ложно, то результат операции будет True.

a = not 5 > 7 print(a) 
True

Старшинство логических операций

Первой выполняется операция not, за ней — and. В последнюю очередь выполняется операция or.

Логические операторы младше операторов сравнения.

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

Здесь мы рассмотрим первые пять, операторы ?? и ??= будут в следующей статье.

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

Давайте рассмотрим их подробнее.

|| (ИЛИ)

Оператор «ИЛИ» выглядит как двойной символ вертикальной черты:

result = a || b;

Традиционно в программировании ИЛИ предназначено только для манипулирования булевыми значениями: в случае, если какой-либо из аргументов true , он вернёт true , в противоположной ситуации возвращается false .

В JavaScript, как мы увидим далее, этот оператор работает несколько иным образом. Но давайте сперва посмотрим, что происходит с булевыми значениями.

Существует всего четыре возможные логические комбинации:

alert( true || true ); // true alert( false || true ); // true alert( true || false ); // true alert( false || false ); // false

Как мы можем наблюдать, результат операций всегда равен true , за исключением случая, когда оба аргумента false .

Если значение не логического типа, то оно к нему приводится в целях вычислений.

Например, число 1 будет воспринято как true , а 0 – как false :

if (1 || 0) < // работает как if( true || false ) alert( 'истинно!' ); >

Обычно оператор || используется в if для проверки истинности любого из заданных условий.

let hour = 9; if (hour < 10 || hour >18)

Можно передать и больше условий:

let hour = 12; let isWeekend = true; if (hour < 10 || hour >18 || isWeekend) < alert( 'Офис закрыт.' ); // это выходной >

ИЛИ "||" находит первое истинное значение

Описанная выше логика соответствует традиционной. Теперь давайте поработаем с «дополнительными» возможностями JavaScript.

Расширенный алгоритм работает следующим образом.

При выполнении ИЛИ || с несколькими значениями:

result = value1 || value2 || value3;

Оператор || выполняет следующие действия:

  • Вычисляет операнды слева направо.
  • Каждый операнд конвертирует в логическое значение. Если результат true , останавливается и возвращает исходное значение этого операнда.
  • Если все операнды являются ложными ( false ), возвращает последний из них.

Значение возвращается в исходном виде, без преобразования.

Другими словами, цепочка ИЛИ || возвращает первое истинное значение или последнее, если такое значение не найдено.

alert( 1 || 0 ); // 1 (1 - истинное значение) alert( true || 'какая-то строка' ); // true alert( null || 1 ); // 1 (первое истинное значение) alert( null || 0 || 1 ); // 1 (первое истинное значение) alert( undefined || null || 0 ); // 0 (поскольку все ложно, возвращается последнее значение)

Это делает возможным более интересное применение оператора по сравнению с «чистым, традиционным, только булевым ИЛИ».

    Получение первого истинного значения из списка переменных или выражений. Например, у нас есть переменные firstName , lastName и nickName , все они необязательные (т.е. они могут быть неопределенными или иметь ложные значения). Давайте воспользуемся оператором ИЛИ || , чтобы выбрать ту переменную, в которой есть данные, и показать её (или «Аноним», если ни в одной переменной данных нет):

let firstName = ""; let lastName = ""; let nickName = "Суперкодер"; alert( firstName || lastName || nickName || "Аноним"); // Суперкодер

Что является результатом действия логического оператора or

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

Пример 2.16. Оператор and

>>> 'a' and 'b'  'b' >>> '' and 'b'  '' >>> 'a' and 'b' and 'c'  'c'
При использовании оператора and, значения вычисляются в булевом контексте слева напрво. Значения 0, '', [], (), <> и None являются ложью, все остальное является истиной [3] . Если у and оба операнда являются истиной, результатом будет последнее значение. В данном случае вычисляется выражение 'a', которое является истиной, затем 'b', которое также является истиной, и возвращается 'b'.
Если какой-либо из операндов является ложью, результатом будет первое такое значение. В данном случает '' — первое значение, являющееся ложью.
Все значения являются истиной, так что в результате мы получаем последнее — 'c'.

Пример 2.17. Оператор or

>>> 'a' or 'b'  'a' >>> '' or 'b'  'b' >>> '' or [] or <>  <> >>> def sidefx(): . print "in sidefx()" . return 1 >>> 'a' or sidefx()  'a'
Как и для and опреранды or вычисляются в булевском контексте слева направо. Если операнд является истиной, or немедленно возвращает результат. В данном случае 'a' — первое истинное значение.
or вычисляет выражение '', которое является ложью, затем 'b', которое является истиной, и возвращает 'b'.
Если все значения являются ложью, or возвращает последнее. or вычисляет '' (ложь), [] (ложь), затем <> (ложь) и возвращает <>.
Обратите внимание, что or вычисляет операнды до тех пор, пока не найдет истинное значение, остальное игнорируется. Это имеет значение, когда вычисление операнда дает сторонние эффекты. В данном случае функция sidefx не вызывается, так как для получения результата выражения с опереатором or достаточно того, что первый операнд, 'a', является истиной.

Если вы используете C, то, наверное, знакомы с выражением bool ? a : b, которое дает a, если bool является истиной, b, если bool ложно. Благодаря особенностям работы операторов and и or в Python, вы можете достигнуть анологичного эффекта.

Пример 2.18. Прием с and-or

>>> a = "first" >>> b = "second" >>> 1 and a or b  'first' >>> 0 and a or b  'second' 
Синтаксис bool ? a : b в языке Python выглядит похоже. Все выражение вычисляется слева направо, так что оператор and применяется первым. 1 and 'first' дает 'first', затем 'first' or 'second' дает 'first'.
0 and 'first' дает 0, тогда 0 or 'second' дает 'second'.

Однако, так как такое выражение выполняет обычные логические операции, а не является специальной конструкцией языка, существует очень важная разница между приемом с and-or в языке Python и конструкцией bool ? a : b в C. Если значение a является ложью, это прием не будет работать так как вы могли ожидать. (Вы можете сказать, что обожгись на этом? Более одного раза?)

Пример 2.19. Когда прием с and-or не работает

>>> a = "" >>> b = "second" >>> 1 and a or b  'second'
Так как a — пустая строка, которую Python считает ложью в булевом контексте, 1 and '' дает '', а '' or 'second' дает 'second'. Ой! Это не то, что мы хотели получить.
Прием с and-or, bool and a or b, не будет работать так же, как конструкция bool ? a : b в C, если a является ложью.

Для безопасного использования приема с and-or необходимо сделать так, чтобы a всегда было истинным. Один из самых распространенных способо это сделать — заменить a на [a] и b на [b], тогда первый элемент получаемого списка будет либо a, либо b.
Пример 2.20. Безопасное использование приема с and-or

>>> a = "" >>> b = "second" >>> (1 and [a] or [b])[0]  ''
Так как выражение [a] является непустым списком, оно никогда не будет ложно. Даже если a равно 0, '' или другому значению, являющемуся ложью, список [a] всегда будет являться истиной, потому что содержит один элемент.

Кажется, этот прием не стоит того, чтобы его использовать. В конце концов вы всегда можете воспользоваться интсрукцией if. Тогда зачем вся эта суета? Конечно, в большинстве случаев выбирая между двумя константами вы можете использовать простой синтаксис и не беспокоиться, потому что значение a всегда будет истинным. И даже если придется использовать более сложный синтакс, на это могут найтись весские причины: в некоторых случаях в языке Python использование инструкции if не допускается, например в lambda-функциях.

  • В Python Cookbook обсуждаются альтернативы приему с and-or.

[3] Ну, почти все. По умолчанию экземпляры классов являются истиной, но вы можете определить специальные методы в классе, чтобы его экземпляры могли быть ложью. Вы узнаете все о классах и специальных методах в главе 3.

Copyright © 2000, 2001, 2002 Марк Пилгрим

Copyright © 2001, 2002 Перевод, Денис Откидач

Что является результатом действия логического оператора or

Оператор ветвления if в зависимости от условия позволяет выбрать одно из двух возможных продолжений программы. Схематично этот оператор можно изобразить так, как показано на рисунке ниже:

Формально в терминах языка программирования это можно записать так:

Оператор ветви «Да» ;

Оператор ветви «Нет» ;

Оператор работает следующим образом: вычисляется записанное в круглых скобках выражение-условие , если оно истинно , то выполняется Оператор ветви «Да» , если ложно — то Оператор ветви «Нет» . После этого управление передаётся на следующий оператор.

Условие — это некоторое выражение, имеющее результат логического или арифметического типа. Условие всегда должно записываться в круглых скобках. Примеры записи условий:

if(a>b) — простое условие, используется операция сравнения;

if(a+b) — а здесь условие содержит арифметическое выражение (сложение двух чисел).

Если в первых двух случаях всё делается так, как и во многих других языках программирования, то вот сумма двух чисел в качестве результата вычисления условия в операторе if может поставить в тупик. Как трактовать такое условие?

Всё очень просто. В языке C не было логического типа данных, поэтому считалось, что число 0 — это ложь , а любое, отличное от 0 число — это истина . В C++ есть логический тип данных ( bool ), но для совместимости с языком C это правило также поддерживается.

По любой из ветвей оператора if положено записывать только один оператор. Если по логике программы требуется не один, а более операторов, то их с помощью фигурных скобок объединяют в блок. Таким образом, по обеим ветвям можно в итоге записывать любое количество любых операторов. В том числе и ни одного.

Пример 1 . Дано натуральное число n . Определить, является ли оно двухзначным или нет.

Возможный текст программы:

using namespace std;

Пример 2 . Даны три числа: a , b , c . Могут ли эти числа быть длинами сторон треугольника? Если «да», то вычислить его площадь, используя формулу Герона:

Возможный текст программы:

using namespace std;

double a, b, c, p, s;

if(a + b > c && b + c > a && a+ c > b)

s = sqrt(p * (p - a) * (p - b) * (p - c));

Условная операция ? :

В языках C/C++ есть одна единственная трёхместная операция — условная операция . Она имеет два специальных символа, разделяющих три части операции. Именно поэтому операция является трёхместной. В ряде случаев её удобно использовать вместо оператора if .

Формальная запись условной операции:

Условие ? Выражение_Да : Выражение_Нет

Условие — логическое или арифметическое выражение, подобное тому, которое можно записать в операторе if ;

Выражение_Да и Выражение_Нет — выражения одного типа (или приводимого к какому-то одному типу).

Вычисление операции выполняется следующим образом. Вначале вычисляется Условие , записанное до символа ? (вопросительный знак). Если условие истинно, то результатом работы операции будет Выражение_Да , если ложно, то Выражение_Нет . Как видно из формальной записи, Выражение_Да и Выражение_Нет разделены символом : (двоеточие).

Результат вычисления условной операции можно присвоить какой-либо переменной или вывести на печать.

Пример 3 . Вычислить максимум из двух чисел.

а)Реализация с помощью условной операции:

max = a > b ? a : b;

б)Реализация с помощью оператора if :

Пример 4 . Дано целое число a , определить, является ли оно чётным или нечётным.

а)Так можно сделать с помощью условной операции:

б)А так делается с помощью оператора if :

Когда применять условную операцию? Лучше всего в простых ситуациях, когда по обеим ветвям в зависимости от истинности условия надо присвоить переменной то или иное значение (как в Примере 3 , а).

Когда действия по ветвям разные, то приемлем только оператор ветвления if .

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *