2012-07-20 7 views
10

Sono un principiante di Python. Trovo che il "else" in "for-else" e "while-else" sia completamente inutile. Perché "for" e "while" funzioneranno finalmente su "else", e invece possiamo usare le solite linee.Perché Python ha "else" in "for-else" e "while-else"?

Ad esempio:

for i in range(1, 5): 
    print i 
else: 
    print 'over' 

E

for i in range(1, 5): 
    print i 
print 'over' 

sono gli stessi.

Quindi perché Python ha "else" in "for-else" e "while-else"?

risposta

21

Si sbaglia sulla semantica di/else. La clausola else viene eseguita solo se il ciclo è stato completato, ad esempio, se non è stata rilevata un'istruzione break.

Il tipico per/ciclo altro aspetto:

for x in seq: 
    if cond(x): 
     break 
else: 
    print "Didn't find an x I liked!" 

pensare alla "altro", come l'abbinamento con tutti i "se del" nel corpo del ciclo. I tuoi campioni sono gli stessi, ma con le dichiarazioni "break" nel mix, non lo sono.

Una descrizione più lunga della stessa idea: http://nedbatchelder.com/blog/201110/forelse.html

+0

... o un'eccezione generata –

+0

Oh, lo so. Grazie mille. – Jimmy

1

La dichiarazione for ... else viene utilizzato per implementare cicli di ricerca.

In particolare, gestisce il caso in cui un ciclo di ricerca non riesce a trovare nulla.

for z in xrange(10): 
    if z == 5: 
     # We found what we are looking for 
     print "we found 5" 
     break # The else statement will not execute because of the break 
else: 

    # We failed to find what we were looking for 
    print "we failed to find 5" 
    z = None 

print 'z = ', z 

uscita:

we found 5 
z = 5 

Tale ricerca è uguale

z = None 
for z in xrange(10): 
    if 5 == z: 
     # We found what we are looking for 
     break 

if z == None: 
    print "we failed to find 5" 
else: 
    print "we found 5" 

print 'z = ', z 

ricordi che for non inizializza z se l'elenco di ricerca è vuota (cioè []). Ecco perché dobbiamo assicurarci che z sia definito quando lo usiamo dopo la ricerca. Quanto segue solleverà un'eccezione perché z non è definito quando proviamo a stamparlo.

for z in []: 
    if 5 == z: 
     break 

print "z = ",z 

uscita

print "z = ",z 
NameError: name 'z' is not defined 

In sintesi, la clausola else eseguirà ogni volta che il ciclo for termina naturalmente. Se si verifica un'interruzione o un'eccezione nel ciclo for, l'istruzione else non verrà eseguita.