python中被忽略的else
阿新 • • 發佈:2019-02-10
對於一個python程式設計師來說,else往往都是配合if來使用的,像這樣:
a = '12'
if a == '123':
print(a)
else:
print('出錯了!')
但是,python中的else並不只能用在if之後,so,這次我們討論一下Python流程控制中的else。
else 子句不僅能在if 語句中使用,還能在 for、while 和 try 語句中使用,這個語言特性不是什麼祕密,但卻沒有得到重視。我們看一個例子:
my_list = ['apple', 'pear', 'orange', 'banana'] for item in my_list: if item == 'banana': print('Founded!') break else: raise ValueError('No banana flavor found!')
本例當中,迴圈最後找到了'banana',輸出'Founded!',並且跳出迴圈,所以else字句並沒有被執行。但如果,將程式碼修改一下,去掉列表中的'banana':
my_list = ['apple', 'pear', 'orange']
for item in my_list:
if item == 'banana':
print('Founded!')
break
else:
raise ValueError('No banana flavor found!')
執行程式碼就會直接丟擲錯誤!如果不使用else字句來完成上述功能,可能我們就需要設定控制標誌了,像這樣:
my_list = ['apple', 'pear', 'orange']
flag = True
for item in my_list:
if item == 'banana':
print('Founded!')
flag = False
break
if flag:
raise ValueError('No banana flavor found!')
很明顯,這裡使用了額外的變數flag和if語句。
while 和 for相類似,簡單舉個例子:
a = 'apple' while a == 'banana': pass else: raise ValueError('No banana flavor found!')
下面看一下try:
try:
dangerous_call()
except OSError:
log('OSError...')
else:
after_call()
很明確,try 塊防守的是 dangerous_call() 可能出現的錯誤,而且很明顯,只有 try 塊不丟擲異常,才會執行after_call()。現在,總結一下else 子句的行為如下:
for
僅當 for 迴圈執行完畢時(即 for 迴圈沒有被 break 語句中止)才執行 else 塊。
while
僅當 while 迴圈因為條件為假值而退出時(即 while 迴圈沒有被break 語句中止)才執行 else 塊。
try
僅當 try 塊中沒有異常丟擲時才執行 else 塊。
即在所有情況下,如果異常或者 return、break 或 continue 語句導致控制權跳到了複合語句的主塊之外,else 子句也會被跳過。for/else、while/else 和 try/else 的語義關係緊密,不過與if/else 差別很大。主要是else 這個單詞的意思阻礙了我們對這些特性的理解。 按正常的理解應該是“要麼執行這個迴圈,要麼做那件事”。可是,在迴圈中,else 的語義恰好相反:“執行這個迴圈,然後做那件事。”不過,相信多使用幾次,你會熟悉的。