(conditionA или conditionB) и (conditionB или Conditionona) ведут себя по-разному

#python #conditional-statements

#python #условные операторы

Вопрос:

Я решал небольшую алгоритмическую задачу. Есть два массива, arr1 и arr2. arr1 содержит несколько случайных целых чисел, а arr2 содержит целые числа, которые случайным образом содержат индексы arr1. Я смог решить проблему, но между ними я получил ошибку, которая является центральной темой этого вопроса. Итак, я не буду вдаваться в подробности об объяснении исходной проблемы, но попытаюсь объяснить это на другом примере.

Предположим, у меня есть два массива:

 arr1 = [1]
arr2 = []
  

Если я использую print((arr1[arr2[-1]] < arr1[0]) or (not arr2)) , я получу, IndexError поскольку arr2 пусто, и вызов arr2[-1] вызовет эту ошибку.

Но, если я использую print((not arr2) or (arr1[arr2[-1]] < arr1[0])) , я получаю вывод как True . Ну, это то, что я на самом деле хотел, но я не могу понять, как замена условий вокруг or оператора изменила результат?

Комментарии:

1. or and короткие замыкания. Как и в случае, если первое условие в or оценивается как истинное, оно не будет проверять другое. И если первое условие является ложным для and , оно не будет проверять остальные

2. and и or всегда ведут себя разумно. Если первое условие равно false (в and ) или true (в or ), результат известен, поэтому второе условие никогда не будет оценено и вычислено.

3. @hansolo, значит ли это, что при наличии нескольких операторов «или», где бы оно ни было истинным, оно останавливает дальнейшую оценку и возвращает True ? И это происходит слева направо?

4. Да, и то же самое для, and если он получает false .

5. Да, и да. В этом случае оценка выполняется слева направо