В чём разница между `and` и `&`, `or` и `|`?

Разница между and/or и &/| заключается в их применении и поведении:

  • and и or - это логические операторы. Они используются для работы с булевыми значениями (True или False) и выполняют логическое И и логическое ИЛИ соответственно. Они также поддерживают "ленивое" вычисление: and возвращает первый ложный операнд, если такой есть, иначе - последний истинный; or возвращает первый истинный операнд, если такой есть, иначе - последний ложный.
  • & и | - это побитовые операторы. Они используются для работы с целыми числами и выполняют побитовые операции И и ИЛИ соответственно. Они применяют операцию к каждому биту в двоичном представлении чисел. Также, их можно использовать в библиотеке `NumPy` для работы с массивами булевых значений поэлементно.

Разница между `and` и `&`, а также `or` и `|` в Python заключается в их области применения и в том, как они обрабатывают операнды.

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

  • Предназначены для работы с булевыми значениями (True и False).
  • Они используют короткое замыкание (short-circuiting). Это означает, что второй операнд вычисляется только в том случае, если это необходимо для определения результата.
  • `and` возвращает первый ложный операнд, если он есть, иначе возвращает последний истинный операнд.
  • `or` возвращает первый истинный операнд, если он есть, иначе возвращает последний ложный операнд.
  • Операнды, не являющиеся булевыми значениями, интерпретируются как True или False в соответствии с правилами truthiness в Python. Например, пустая строка (`""`) и `0` считаются False, а непустая строка и ненулевое число считаются True.

Пример:


x = 5
y = 0

result_and = x > 0 and y > 0  # y > 0 не вычисляется, так как x > 0 уже False
print(result_and) # Output: False

result_or = x > 0 or y > 0 # y > 0 не вычисляется, так как x > 0 уже True
print(result_or) # Output: True
  

Побитовые операторы `&` и `|`

  • Предназначены для работы с целыми числами.
  • Они выполняют побитовые операции AND и OR соответственно.
  • Они всегда вычисляют оба операнда.
  • `&` выполняет побитовое AND: каждый бит результата равен 1 только в том случае, если оба соответствующих бита в операндах равны 1.
  • `|` выполняет побитовое OR: каждый бит результата равен 1, если хотя бы один из соответствующих битов в операндах равен 1.

Пример:


x = 5  # 0101 в двоичном представлении
y = 3  # 0011 в двоичном представлении

result_and = x & y  # 0101 & 0011 = 0001
print(result_and)  # Output: 1

result_or = x | y  # 0101 | 0011 = 0111
print(result_or)  # Output: 7
  

Ключевые отличия:

  • `and` и `or` работают с булевыми значениями и используют короткое замыкание, а `&` и `|` работают с целыми числами и выполняют побитовые операции, всегда вычисляя оба операнда.
  • Использование `&` и `|` вместо `and` и `or` с булевыми значениями может привести к неожиданным результатам, так как будут выполнены побитовые операции над целочисленным представлением True (1) и False (0).
0