Почему порядок операторов в «или» состоянии имеет значение? - PullRequest
0 голосов
/ 03 апреля 2019

Я работал над проблемой, когда менял слова на месте.Я заметил, что в зависимости от порядка моих операторов до и после моего оператора or код не будет работать или работать.

Если я изменю

if i == len(s1) or s1[i] == ' ':

на

if s1[i] == ' ' or i == len(s1):

Я получаю сообщение об ошибке

Traceback (most recent call last):
  File "reverse_words_in_place.py", line 58, in <module>
    reverse_words(s1)
  File "reverse_words_in_place.py", line 6, in reverse_words
    if s1[i] == ' ' or i == len(s1):
IndexError: list index out of range
def reverse_words(s1):
    reverse_string(s1, 0, len(s1)-1)

    start_index = 0
    for i in range(len(s1)+1):
        if i == len(s1) or s1[i] == ' ':
            reverse_string(s1, start_index, i-1)
            start_index = i + 1
    return s1


def reverse_string(s1, first, last):
    while(first < last):
        s1[first], s1[last] = s1[last], s1[first]

        first += 1
        last -= 1

s1 = ['c', 'a', 'k', 'e', ' ',
      'p', 'o', 'u', 'n', 'd', ' ',
      's', 't', 'e', 'a', 'l']

reverse_words(s1)

# Prints: 'steal pound cake'
print(''.join(s1))

Выходные данные для этого кода

steal pound cake

, если

if i == len(s1) or s1[i] == ' ':

Почемуважно, в каком порядке эти заявления?

Ответы [ 3 ]

8 голосов
/ 03 апреля 2019

Потому что, если i == len(s1) равно true, второй оператор не оценивается, и вы не получаете IndexError.

Причина этого Short-circuit_evaluation .

3 голосов
/ 03 апреля 2019

Это потому, что в python, как и в большинстве языков программирования, операторы или и и имеют короткое замыкание. Например, если левая часть или истинна, то она знает, что оператор whole или будет истинным, не удосуживаясь проверить правую часть.

Длинное многословное объяснение:

Это может показаться как оценка A или B , мы начнем с оценки A , затем мы оценим B и наконец, результаты будут или вместе для окончательного результата. Однако то, что на самом деле происходит, это "короткое замыкание": A оценивается и, если оно истинно, мы не беспокоимся о B ВСЕ , потому что мы знаем прямо тогда и там , что A или B оценивается как истинное.

Аналогично, A и B короткое замыкание: мы начинаем с оценки A , и если оно ложно, мы уже знаем, что A и B будут оцениваться как ложные так что мы вообще не беспокоимся об оценке B .

Это может на самом деле использоваться для написания более краткого кода. Например, следующее:

if A: # is obj valid?
  if B: # do a check that requires obj to be valid
    C

... можно написать так:

if A and B:
  C
1 голос
/ 03 апреля 2019

ИЛИ прекращает поиск условия, как только оно находит истину.

...