5 回答

TA貢獻1805條經驗 獲得超10個贊
因為or運算符通過檢查第一個條件來工作,如果第一個條件不為真,則檢查第二個條件。
你的左邊or是真的(len(message) == 0),所以右邊不被執行(message[0] == message[-1])。因此,您不會得到范圍異常。
如果交換順序,message[0] == message[-1]位于運算符的左側,因此執行時不會檢查字符串是否為空。
您將在此示例中看到
def condition_1():
print('condition_1 executed')
return True
def condition_2():
print('condition_2 executed')
return True
if condition_1()or condition_2():
print('one condition is true')
你會得到condition_1 executed。如果更改condition_1 為 return false,您將同時得到condition_1 executed和condition_2 executed。

TA貢獻1805條經驗 獲得超9個贊
第一個程序工作的原因是它首先檢查len
消息的 0 是否為 0,如果是,True
則立即進入 if 語句,而第二個程序首先檢查第一個字母是否等于最后一個字母,并且由于空字符串如果失敗則沒有索引 0。

TA貢獻1830條經驗 獲得超9個贊
最近,當我瀏覽cs61a時,我在課程網站上發現了一些非常有用的信息,我決定涵蓋重要部分并將鏈接放在這里,供其他可能提出這個問題的人作為參考。
這個問題基本上是由Python處理表達式的順序引起的,即Short Circuiting。例如,當您在 Python 中鍵入以下內容時:
1?/?0?or?True
我們會得到 a?ZeroDivisionError
,因為 1 除以 0 在數學中是無效的。聽起來很合理,對吧?但是運行這段代碼我們會得到什么呢?
True?or?1?/?0
True
既然它只是交換了和 的順序1 / 0
,也許我們會得到相同的結果?答案是否定的,運行代碼后,我們得到了True
相反的結果,這就是短路的工作原理!
當運算符到達允許他們對表達式做出結論的操作數時,就會發生短路。在這種情況下,or
一旦到達第一個真值就會短路,因為它知道至少有一個值是真而不執行1 / 0
(盡管它是無效的)。同樣,and
當第一個值為 false 時會短路,因為它知道并非所有值都是 true。
這是備忘單:
操作員 | 支票 | 從左到右評估 |
---|---|---|
和 | 如果所有值都是 true | 第一個假值 |
或者 | 如果至少有一個值為 true | 第一個真實值 |

TA貢獻1848條經驗 獲得超10個贊
這是因為第二個程序中出現“IndexError:字符串索引超出范圍”錯誤。第一個程序首先比較 len(message) 并且已經有一個“True”。雖然您的第二個程序首先將第一個字符與最后一個字符進行比較。所以這個問題。

TA貢獻1845條經驗 獲得超8個贊
如果至少一個條件為真,“或”語句為 True。當“or”的左側為 true 時,右側不會執行,因此第二個程序中出現空字符串錯誤,但第一個程序中的空字符串沒有錯誤
添加回答
舉報