August 21, 2018

Зачем нужны or и and в Python?

Сначала может показаться, что вопрос в заголовке, как минимум, странный и в чём-то даже глупый, но не всё так просто. Как известно, в языке Python есть побитовые операции &(и), |(или), а также ^(строгое или). Однако есть ещё "словесные" братья and и or, которые используются в условиях. Однако зачем они нужны, если можно использовать & и | вместо них и всё будет работать? На этот вопрос мы и попытаемся ответить в данной статье. Для начала лучше вникнем в суть происходящего:

print(True or False) # True
print(True | False)  # True
print(True and False)  # False
print(True & False)  # False

Как можно заметить, результат они выдают одинаковый. Так в чём же разница? Ответить можно одним словом - оптимизация. Наглядно это проиллюстрирует следующий пример:

def print_and_return(boolean):
	print(boolean)
	return boolean

print("Обычный |")
res1 = print_and_return(True) | print_and_return(False)
print("Словесный or")
res2 = print_and_return(True) or print_and_return(False)

В первом случае, выведутся все 2 значения: результат первой функции, результат второй. А вот во втором случае, нас ждёт сюрприз: второго вызова функции не произойдёт. Почему? Потому что or умеет оптимизировать обработку условий: результат будет истинным независимо от второго условия: ведь первое истинно - так зачем нужно считать второе?

То же самое с and:

  def print_and_return(boolean):
  	print(boolean)
  	return boolean
  
  print("Обычный &")
  res1 = print_and_return(False) & print_and_return(True)
  print("Словесный and")
  res2 = print_and_return(False) and print_and_return(True)

Понятно, что условие ложно после вычисления первого выражения и and пропускает второе, сразу выдавая результат.

Теперь должно стать ясно, что для условий "выгоднее" использовать or и and вместо | и &, кроме тех случаев, когда необходимо выполнение всех частей условия. Например :

(a != 0) and (1 / a)

никогда не выкинет ошибку деления на ноль. Думаю, таких применений можно придумать массу, но это занятие я оставляю вам, а сам расскажу про ещё одну интересную особенность or и and.

Их можно использовать для inline выражений не только с bool, но и с любыми другими типами, которые приводятся к логическому. Рассмотрим следующие выражения:

print(3 or 10) # 3
print("" or 5) # 5
print("" and 20) # Выведет пустую строку
print(3 and 10) # 10

То есть оператор or работает по принципу: если первое выражение - истина, то возвращаем его, иначе возвращаем второе.

And работает по-другому: если первое - ложь, то возвращаем его, иначе вернём второе.

Думаю, теперь вы разобрались, как работают эти 2 оператора и сможете эффективно использовать их особенности в своих программах.

На этом всё.

До новых встреч в группе SnakeBlog