我正在解决一个我在原地反转单词的问题。我注意到,根据我的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] == ' ':
为什么这些语句按什么顺序重要?
答案 0 :(得分:8)
因为如果i == len(s1)
为true
,则第二条语句将不被评估,您也不会得到IndexError
。
答案 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)
或一旦发现符合条件,便立即停止寻找条件。