为什么“或”条件中的语句顺序很重要?

时间:2019-04-03 19:39:45

标签: python logical-operators

我正在解决一个我在原地反转单词的问题。我注意到,根据我的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 个答案:

答案 0 :(得分:8)

因为如果i == len(s1)true,则第二条语句将不被评估,您也不会得到IndexError

原因是Short-circuit_evaluation

答案 1 :(得分:3)

这是因为与大多数编程语言一样,在python中,运算符短路。例如,如果的左侧为true,则表示 entire 语句为真,而无需费心检查右侧手侧。

冗长的解释:

似乎 想要评估 A或B ,我们先评估 A ,然后评估 B < / strong>,最后将结果在一起以得到最终结果。但是,实际上 发生的是“短路”:对 A 进行了评估,如果为真,我们就不用担心对 B 进行评估。 全部,因为我们马上就知道了 A或B 为真。

类似地, A和B 短路:我们从评估 A 开始,如果为假,我们已经知道 A和B 评估为false,因此我们完全不用担心评估 B

这实际上可以用来编写更简洁的代码。例如,以下内容:

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

...可以这样写:

if A and B:
  C

答案 2 :(得分:1)

或一旦发现符合条件,便立即停止寻找条件。