1. 程式人生 > >python中被忽略的else

python中被忽略的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 塊防守的是 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 的語義恰好相反:“執行這個迴圈,然後做那件事。”不過,相信多使用幾次,你會熟悉的。