歡迎光臨
每天分享高質量文章

Python 中被忽略的 else

來源:Python中文社群

ID:python-china

else, 我們再熟悉不過了。對於一個python程式員來說,else往往都是配合if來使用的,像這樣:

  1. a = '12'

  2. if a == '123':

  3.    print(a)

  4. else:

  5.    print('出錯了!')

但是,python中的else並不只能用在if之後,so,這次我們討論一下Python流程控制中的else。

else子句不僅能在if 陳述句中使用,還能在 for、while 和 try 陳述句中使用,這個語言特性不是什麼秘密,但卻沒有得到重視。我們看一個例子:

  1. my_list = ['apple', 'pear', 'orange', 'banana']

  2. for item in my_list:

  3.    if item == 'banana':

  4.        print('Founded!')

  5.        break

  6. else:

  7.    raise ValueError('No banana flavor found!')

本例當中,迴圈最後找到了'banana',輸出'Founded!',並且跳出迴圈,所以else字句並沒有被執行。但如果,將程式碼修改一下,去掉串列中的'banana':

  1. my_list = ['apple', 'pear', 'orange']

  2. for item in my_list:

  3.    if item == 'banana':

  4.        print('Founded!')

  5.        break

  6. else:

  7.    raise ValueError('No banana flavor found!')

執行程式碼就會直接丟擲錯誤!如果不使用else字句來完成上述功能,可能我們就需要設定控制標誌了,像這樣:

  1. my_list = ['apple', 'pear', 'orange']

  2. flag = True

  3. for item in my_list:

  4.    if item == 'banana':

  5.        print('Founded!')

  6.        flag = False

  7.        break

  8. if flag:

  9.    raise ValueError('No banana flavor found!')

很明顯,這裡使用了額外的變數flag和if陳述句。

while 和 for相類似,簡單舉個例子:

  1. a = 'apple'

  2. while a == 'banana':

  3.    pass

  4. else:

  5.    raise ValueError('No banana flavor found!')

下麵看一下try:

  1. try:

  2.    dangerous_call()

  3. except OSError:

  4.    log('OSError...')

  5. else:

  6.    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好文請點選【閱讀原文】哦

↓↓↓

贊(0)

分享創造快樂

© 2024 知識星球   網站地圖