为什么 'or' 条件中的语句顺序很重要?
Why does the order of statements in an 'or' condition matter?
我正在解决一个问题,我在原地颠倒单词。我注意到,根据 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] == ' ':
为什么这些语句的顺序很重要?
因为如果 i == len(s1)
是 true
第二个语句不会被评估并且你不会得到 IndexError
.
这是因为在python中,和大多数编程语言一样,运算符or和and短路。例如,如果 or 的左侧为真,则它知道 entire or 语句无需费心检查右侧即可。
冗长的解释:
似乎 想评估 A 或 B 我们将从评估 A 开始,然后我们将评估 B,最后将结果 或 放在一起作为最终结果。但是,实际上 发生的是 "short circuit":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
OR 一旦找到 true 就停止寻找条件。
我正在解决一个问题,我在原地颠倒单词。我注意到,根据 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] == ' ':
为什么这些语句的顺序很重要?
因为如果 i == len(s1)
是 true
第二个语句不会被评估并且你不会得到 IndexError
.
这是因为在python中,和大多数编程语言一样,运算符or和and短路。例如,如果 or 的左侧为真,则它知道 entire or 语句无需费心检查右侧即可。
冗长的解释:
似乎 想评估 A 或 B 我们将从评估 A 开始,然后我们将评估 B,最后将结果 或 放在一起作为最终结果。但是,实际上 发生的是 "short circuit":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
OR 一旦找到 true 就停止寻找条件。