2010-12-01 10 views
9

Consideremos el siguiente código en C:Loop con las condiciones de pitón

for(int i=0; i<10 && some_condition; ++i){ 
    do_something(); 
} 

me gustaría escribir algo similar en Python. La mejor versión que se me ocurre es:

i = 0 
while some_condition and i<10: 
    do_something() 
    i+=1 

Francamente, no me gusta while bucles que imitan for bucles. Esto se debe al riesgo de olvidarse de incrementar la variable contraria. Otra opción, que nombres de direcciones de este riesgo es:

for i in range(10): 
    if not some_condition: break 
    do_something() 

Aclaraciones importantes

  1. some_condition no está destinado a ser calculada durante el bucle, sino más bien para especificar si desea iniciar el bucle en el primer colocar

  2. me refiero a Python2.6

¿Qué estilo se prefiere? ¿Hay una mejor expresión idiomática para hacer esto?

+0

Creo que esto es una cuestión de preferencia personal. – NPE

+0

¿Qué versión de Python? – khachik

+1

Creo que Python debería tener una construcción como 'do veces:', para permitirle explicitar que no va a utilizar realmente el contador de bucles. –

Respuesta

7

En general, se prefiere el estilo "range + break" -, pero en Python 2.x, utilice xrange en lugar de range para la iteración (esto crea los valores bajo demanda en lugar de realmente hacer una lista de números).

Pero siempre depende. ¿Qué tiene de especial el número 10 en este contexto? ¿Qué es exactamente some_condition? Etc.

de respuesta a la actualización:

Suena como si some_condition es un "bucle invariante", es decir, no va a cambiar durante el bucle. En ese caso, sólo tenemos que probarlo primero:

if some_condition: 
    for i in xrange(10): 
    do_something() 
+0

10 y el rango son solo ejemplos que podrían haber sido 'for i in my_array'. Como se aclara en la pregunta, 'some_condition' controla si el programa necesita realizar el ciclo u omitirlo en absoluto –

+0

Su versión es sencilla y funciona. Solo quería ahorrar indentación adicional. Gracias –

3

for bucles con una constante límite superior son un poco rara en Python. Si está interactuando sobre somearray, es posible hacer:

for i in xrange(len(somearray)): 
    if not some_condition: 
     break 
    do_sth_with(i, somearray[i]) 

, o mejor:

for i, item in enumerate(somearray): 
    if not some_condition: 
     break 
    do_sth_with(i, item) 
8

Esto no podría estar relacionado, pero no es lo que yo estoy acostumbrado a hacer ... Si es some_condition bastante simple, lo puso en una función y filter artículos permite repetir:

def some_condition(element): 
    return True#False 

for i in filter(some_condition, xrange(10)): 
    pass 

se puede usar esta aproximación también cuando iterar sobre alguna lista de elementos.

selected = filter(some_condition, to_process) 
for i, item in enumerate(selected): 
    pass 

De nuevo, este podría no ser tu caso, debes elegir el método de filtrar los elementos dependiendo de tu problema.

+1

O, haciéndolo aún más corto y menos legible: 'para i en filtro (lambda x: True, rango (10)): do_something()' –

Cuestiones relacionadas