while、for、try except語句中的else
Python中的else是基礎(chǔ)的語句,它的兩種使用形式是:
- if condition:
- doSomeThings
- else:
- doAnthorThings
以及
- if condition1:
- do1
- elif condition2:
- do2
- else:
- doOtherThings
這兩個用法理解起來沒有問題。下面要看的是for,while循環(huán)和try異常處理語句中的else的用法。
一、for,while循環(huán)中的else
for,while循環(huán)中,else用于循環(huán)正常結(jié)束,且循環(huán)體中沒有break、return和異常拋出,則執(zhí)行else語句塊中的內(nèi)容。 例如,我們判斷列表ls中是否全是奇數(shù)。普通情況下,需要引入一個標志變量allOdd,指示所有變量都是奇數(shù),有偶數(shù)出現(xiàn)則將此變量設(shè)為False。寫法如下:
- ls = [1, 3, 5, 7, 9]
- allOdd = True
- for i in ls:
- if i % 2 == 0:
- allOdd = False
- break
- if allOdd:
- print('list ls %r constructed by only odd number' % ls)
- else:
- print('list ls %r ** is\'t ** constructed by only odd number' % ls)
利用else指示循環(huán)正常結(jié)束的功能,采用for循環(huán)或者while循環(huán)加else的寫法如下:
- for i in ls:
- if i %2 == 0:
- print('list ls %r ** is\'t ** constructed by only odd number' % ls)
- break
- else:
- print('list ls %r constructed by only odd number' % ls)
可見,for循環(huán)使用else語句之后,節(jié)省了指示性變量allOdd,以及相應(yīng)的處理語句。整個程序語義上更簡潔、邏輯上更順暢。
二、try異常處理語句中的else
try except異常捕獲處理語句中,else定義用于沒有異常出現(xiàn)時執(zhí)行的部分。 例如,當我們處理有可能導致異常的計算時,else語句定義的部分,可以確保沒有異常發(fā)生,得到了正確計算結(jié)果。例子是計算簡單的除法。普通寫法:
- try:
- result = a/b
- print(result)
- except TypeError:
- print('輸入數(shù)字')
- except ZeroDivisionError:
- print('被除數(shù)不能為零')
采用else語句時的寫法:
- try:
- result = a/b
- except TypeError:
- print('輸入數(shù)字')
- except ZeroDivisionError:
- print('被除數(shù)不能為零')
- else:
- print('計算結(jié)果%r'%result)
也就是說,try except else finally分別對應(yīng)如下關(guān)系:
- try 可能拋出異常的語句。
- except 捕獲異常,處理異常。
- else 無異常,明確得知try語句中無異常。而不是這兩種情況:有異常;有異常但處理了。
- finally 有或無異常,都執(zhí)行的語句,一般為關(guān)閉、清理工作。
else語句在try except句法中最主要的功能,是明確指出了沒有異常出現(xiàn)時才執(zhí)行的語句塊。與出現(xiàn)異常,或者出現(xiàn)異常并且處理了這兩種情況是分開的。這個語法塊是在沒有異常出現(xiàn)時執(zhí)行的,保證了環(huán)境的正確性。
三、簡單總結(jié)
- for while循環(huán)中,else用于循環(huán)正常結(jié)束,且循環(huán)體中沒有break、return或異常拋出,則執(zhí)行else語句塊中的內(nèi)容。
- try except異常捕獲處理語句中,else是定義用于沒有異常出現(xiàn)時執(zhí)行的部分。
- 不同于if else 語句,以上兩種else用法看起來有些復雜。簡單理解,可以把else語句塊當做語句主體中“沒有幺蛾子“時執(zhí)行的語句塊。這樣就可以簡單理解了else的兩種用法了。
- 許多人反對在此處復用else關(guān)鍵字來表達除外情況,認為then關(guān)鍵字或許更好(luciano ramalho《fluent python》),更甚者主張遵循“最小驚訝原則”,即在for和while語境里不要用else關(guān)鍵字,以免它給人帶來疑惑(Brett Slatkin《Effective Python》)。筆者認為,如果把兩處else統(tǒng)一理解為“沒有出現(xiàn)問題,沒有幺蛾子”,那么此時的else語法會變成一個很有用的技巧。