來源:Python中文社群
ID:python-china
else, 我們再熟悉不過了。對於一個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 塊防守的是 dangerouscall() 可能出現的錯誤,而且很明顯,只有 try 塊不丟擲異常,才會執行aftercall()。
現在,總結一下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 的語意恰好相反:“執行這個迴圈,然後做那件事。”不過,相信多使用幾次,你會熟悉的。
《Python人工智慧和全棧開發》2018年07月23日即將在北京開課,120天衝擊Python年薪30萬,改變速約~~~~
*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。
- END -
更多Python好文請點選【閱讀原文】哦
↓↓↓