2009-10-16 46 views
6

我最近偶然發現了Python在不同複合語句中處理else子句的方式看起來不一致。由於Python設計得非常好,我確信有一個很好的解釋,但我想不起來。爲什麼其他語句在for/while語句中的行爲與if/try語句相反?

考慮以下幾點:

if condition: 
    do_something() 
else: 
    do_something_else() 

這裏,do_something_else()只有當condition是假的,按預期執行。

同樣,在

try: 
    do_something() 
except someException: 
    pass: 
else: 
    do_something_else() 
finally: 
    cleanup() 

do_something_else()如果沒有異常發生時,纔會執行。

但是在for或while循環中,總是執行else子句,不管for/while block的內容是否已經執行。

for i in some_iterator: 
    print(i) 
else: 
    print("Iterator is empty!") 

將始終打印 「的Iterator是空的!」,無論我說some_iterator = []some_iterator = [1,2,3]。在while-else子句中有相同的行爲。在我看來,在這些情況下,else的行爲更像finally。我忽略了什麼?

+0

我很驚訝Python允許語法。在大多數其他語言中,else僅限於與if或switch語句一起使用。 For-loops和try-statements可能控制流,但它們不像if語句那樣有條件,所以-else在它們中沒有地位。 – shuckster 2009-10-16 07:03:57

+2

對於它的價值,最近在python-ideas列表上進行了很長時間的關於for/else等的討論,總結如下:http://article.gmane.org/gmane.comp.python.ideas/6131 /。 Guido自己承認對此有第二個想法:http://article.gmane.org/gmane.comp.python.ideas/6133/ – 2009-10-16 08:17:29

+0

感謝這些鏈接! – 2009-10-16 08:40:53

回答

5

嗯,這取決於你如何看待它。你可以看看別人的這樣的(原諒尖叫,它能夠使代碼強調的唯一途徑):

if condition: 
    do_something() 
IF THE PREVIOUS CONDITION WAS FALSE: 
    do_something_else() 

現在,有之間的if/else與try /除/否則,如果有明顯的相似性您將else語句看作except語句的其他語句。喜歡這個。

try: 
    do_something() 
IF THERE WAS AN EXCEPTION: 
    pass: 
IF THE PREVIOUS CONDITION WAS FALSE: 
    do_something_else() 
finally: 
    cleanup() 

也是一樣的else /爲:

IF some_iterator IS NOT EMPTY: 
    i = next(some_iterator) 
    print(i) 
IF THE PREVIOUS CONDITION WAS FALSE: 
    print("Iterator is empty!") 

所以在這裏我們看到,在一些根本途徑在做別的工作在所有三種情況完全一樣。

但你也可以看到其他人以這樣的方式

try: 
    do_something() 
except someException: 
    pass: 
IF NO EXCEPTION: 
    do_something_else() 
finally: 
    cleanup() 

然後它不再是相同的,但由於其他一種「如果沒有別的。」您可以以同樣的方式查看/其他:

for i in some_iterator: 
    print(i) 
IF NO MORE ITERATING: 
    print("Iterator is empty!") 

但話又說回來,考慮到ELIF,然後看到它的這種方式適用於if/else語句還有:

if condition: 
    do_something() 
elif otherconditaion: 
    do_anotherthing() 
IF NO CONDITION WAS TRUE: 
    do_something_else() 

哪種方式你想要看看其他方面取決於你,但在兩種觀看方式中,否則在所有三種情況下都有相似之處。

+0

謝謝。這是有道理的,並回答我的問題。 – 2009-10-16 08:42:25

13

如果沒有break語句爲循環執行的for else構建執行else條款,as described here例如,這else子句不會求

for i in range(1,10): 
    if i % 5 == 0: 
     print i 
     break 
else: 
    print "nothing divisible by 5" 
+0

對,所以for/while-else語句只有在某處出現break語句時纔有意義。 – 2009-10-16 08:49:43

4

是的,作爲禮提到的,else子句時,纔會執行如果你不打破。它阻止你實現這樣的代碼:

for i in range(1,10): 
    if i % 5 == 0: 
     print i 
     break 
if i % 5 != 0: 
    print "nothing divisible by 5" 

如果退出的條件是一個比較複雜(如檢查各種可能的條件或條件的組合),這大致相當於這裏,但方便。

相關問題