[Python]循環(huán)語句中的 else 子句
有其它編程語言經(jīng)驗的程序員接觸到 Python 時最訝異的莫過于無所不在的 else,不僅分枝語句有,而且循環(huán)語句也有,甚至連異常處理也有。但現(xiàn)在我們來看看循環(huán)語句中的 else,看看它們的語法:
while_stmt ::=
"while" expression ":" suite
["else" ":" suite]
for_stmt ::=
"for" target_list "in" expression_list
":" suite
["else" ":" suite]
要談 else 分句,必須要知道 Python 從 C 語言中借來了語義相同的 break 和 continue 語句,因為 else 分句提供了隱含的對循環(huán)是否由 break 語句引發(fā)循環(huán)結(jié)束的判斷。先來看一個沒有應(yīng)用 else 子句的例子:
>>> def print_prime(n):
... for i in xrange(2, n):
... found = True
... for j in xrange(2, i):
... if i % j == 0:
... found = False
... break
... if found:
... print '%d is a prime number'%i
這是一個查找素數(shù)的簡單實現(xiàn),可以看到我們借助了一個標(biāo)志量 found 來判斷是循環(huán)結(jié)束是不是由 break 語句引起的,如果對 else 善加利用,代碼可以簡潔得多:
>>> def print_prime2(n):
... for i in xrange(2, n):
... for j in xrange(2, i):
... if i % j == 0:
... break
... else:
... print '%d is a prime number'%i
當(dāng)循環(huán)“自然”終結(jié)(循環(huán)條件為假)時 else 從句會被執(zhí)行一次,而當(dāng)循環(huán)是由 break 語句中斷時,else 從句就不被執(zhí)行。
與 for 語句相似,while 語句的else 子句的語意是一樣的。else 塊在循環(huán)正常結(jié)束和循環(huán)條件不成立時執(zhí)行。
與 C/C++ 等較為“老土”的語言相比,else 子句使程序員的生產(chǎn)力、和代碼的可讀性都得到了提高。盡管如此,我見過的代碼中使用 else 子句的情況并不多,大概是因為大家都習(xí)慣了 C 式的標(biāo)志量解決方案,我建議大家多使用 else。
最后八卦一下,如果在 python 中想直接退出多重循環(huán),你應(yīng)該使用異常,python 不提供 goto。關(guān)于異常,下次我們再來聊聊。