2012-07-20 9 views
10

Soy un principiante de Python. Encuentro que el "else" en "for-else" y "while-else" es completamente innecesario. Porque "para" y "mientras" finalmente se ejecutará en "else", y podemos usar las líneas habituales en su lugar.¿Por qué Python tiene "else" en "for-else" y "while-else"?

Por ejemplo:

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

Y

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

son los mismos.

¿Por qué Python tiene "else" en "for-else" y "while-else"?

Respuesta

21

Se equivoca sobre la semántica de for/else. La cláusula else se ejecuta solo si el ciclo se completó, por ejemplo, si no se encontró una declaración de interrupción.

La típica para lazo/cosa es así:

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

pienso en la "otra" como el emparejamiento con todos los "si de" en el cuerpo del bucle. Sus muestras son las mismas, pero con declaraciones "break" en la mezcla, no lo son.

Una descripción más detallada de la misma idea: http://nedbatchelder.com/blog/201110/forelse.html

+0

... o una excepción lanzada –

+0

¡Oh, eso lo sé! Muchísimas gracias. – Jimmy

1

La declaración for ... else se utiliza para implementar bucles de búsqueda.

En particular, maneja el caso donde un bucle de búsqueda no puede encontrar nada.

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 

de salida:

we found 5 
z = 5 

Esa búsqueda es la misma que

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 

Recuerde que for no inicializa z si la lista de búsqueda está vacío (es decir []). Es por eso que debemos asegurarnos de que z se define cuando lo usamos después de la búsqueda. Lo siguiente generará una excepción porque z no está definido cuando intentamos imprimirlo.

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

print "z = ",z 

salida

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

En resumen, la cláusula else se ejecutará siempre que el bucle for termina naturalmente. Si se produce un corte o una excepción en el bucle for, la instrucción else no se ejecutará.

Cuestiones relacionadas