2009-05-28 18 views
21

Estoy encontrando problemas cuando debería usar un loop while o un loop for en Python. Parece que la gente prefiere usar un for bucle (¿menos líneas de código?). ¿Hay alguna situación específica que deba usar una u otra? ¿Es una cuestión de preferencia personal? Los códigos que he leído hasta ahora me hicieron pensar que hay grandes diferencias entre ellos.Cuándo usar "while" o "for" en Python

Respuesta

48

sí, hay una gran diferencia entre tiempo y para.

La para la declaración itera a través de una colección u objeto iterable o función de generador.

La instrucción mientras que simplemente gira hasta que una condición es False.

No es una preferencia. Es una cuestión de cuáles son sus estructuras de datos.

A menudo, representamos los valores que queremos procesar como range (una lista real) o xrange (que genera los valores). Esto nos da una estructura de datos a medida para la declaración para.

En general, sin embargo, tenemos una colección preparada: un conjunto, tupla, lista, mapa o incluso una cadena ya es una colección iterable, por lo que simplemente usamos un para el bucle.

En algunos casos, es posible que deseemos algún procesamiento de programación funcional para nosotros, en cuyo caso podemos aplicar esa transformación como parte de la iteración. Las funciones sorted y enumerate aplican una transformación en un iterable que se ajusta naturalmente a la declaración para.

Si no tiene una estructura de datos ordenada para repetir, o si no tiene una función de generador que impulse su procesamiento, debe usar mientras.

+0

+1 Esto es lo que * quería * decir :) –

+0

Creo que lo tengo, como el ejemplo que hizo Konrad. Es más una cuestión de legibilidad, puede utilizar ambas iteraciones, pero es preferible utilizar el tiempo para una estructura de datos más vaga. – Fabio

+4

@fabio: "Es más una cuestión de legibilidad". No. Es una cuestión de emparejar el algoritmo y la estructura de datos. No hay pensamiento ni ningún "preferible". Es sencillo. ** Usar para a menos que sea imposible. ** Si es imposible por alguna razón, entonces ** mientras **. –

12

La for es la opción más pitónica para repetir una lista, ya que es más simple y fácil de leer.

Por ejemplo esto:

for i in range(11): 
    print i 

es mucho más simple y más fácil de leer que esto:

i = 0 
while i <= 10: 
    print i 
    i = i + 1 
+0

Entonces, ¿podríamos decir que el 'While' es algo más obsoleto en python? – Fabio

+4

@fabio ... no del todo. Hay bucles que solo se pueden escribir razonablemente mientras se usa, pero en su mayoría se debe intentar utilizar con preferencia a while. –

17

while es útil en escenarios en los que la condición de corte no depende lógicamente de cualquier tipo de secuencia. Por ejemplo, considere las interacciones impredecibles:?

while user_is_sleeping(): 
    wait() 

Por supuesto, podría escribir un iterador apropiada para encapsular esa acción y hacer que sea accesible a través de for - pero ¿cómo habría que servir a la legibilidad ¹

En todo otros casos en Python, use for (o una función apropiada de orden superior que encapsula el ciclo).

¹ asumiendo la función de user_is_sleeping devuelve False cuando falsa, el código de ejemplo podría ser reescrita como la for bucle siguiente:

for _ in iter(user_is_sleeping, False): 
    wait() 
+0

Si no es un problema y solo una cuestión de curiosidad, dijiste que podría escribir una declaración para reemplazar ese ciclo while, ¿cómo sería eso? Gracias – Fabio

+0

+1 Esta es una buena respuesta también. –

2

Para los bucles generalmente se aclara lo que está haciendo la iteración. No siempre se pueden usar directamente, pero la mayoría de las veces la lógica de iteración con el ciclo while se puede envolver dentro de un func generador. Por ejemplo:

def path_to_root(node): 
    while node is not None: 
     yield node 
     node = node.parent 

for parent in path_to_root(node): 
    ... 

En lugar de

parent = node 
while parent is not None: 
    ... 
    parent = parent.parent 
4

En primer lugar hay diferencias entre el bucle for en Python y en otros idiomas. Mientras en python itera sobre una lista de valores (por ejemplo: para el valor en [4,3,2,7]), en la mayoría de los otros lenguajes (C/C++, Java, PHP etc.) actúa como un ciclo while, pero más fácil de leer

Para los bucles se utilizan generalmente cuando se conoce el número de iteraciones (la longitud de una matriz, por ejemplo), y cuando se usan bucles cuando no se sabe cuánto tiempo llevará (por ejemplo, el algoritmo bubble sort que bucles) siempre que los valores no estén ordenados)

+0

Un gran consejo, por cierto, creo que la razón principal por la que tuve esta duda fue porque vine de PHP, que nunca vi una diferencia clara entre FOR y While – Fabio

+0

Los bucles For se usan cuando desea realizar operaciones en cada miembro de una secuencia, en orden. Mientras que los bucles se utilizan cuando es necesario: operar en los elementos fuera de servicio, acceder/operar en múltiples elementos simultáneamente o en bucle hasta que alguna condición cambie de verdadera a falsa. – apraetor

3

Considere el procesamiento de iterables. Puede hacerlo con un bucle for:

for i in mylist: 
    print i 

O bien, puede hacerlo con un while bucle:

it = mylist.__iter__() 
while True: 
    try: 
     print it.next() 
    except StopIteration: 
     break 

Estos dos bloques de código hacen fundamentalmente la misma cosa fundamentalmente de la misma manera . Pero el bucle for oculta la creación del iterador y el manejo de la excepción StopIteration para que no tenga que ocuparse de ellos usted mismo.

La única vez que se me ocurre que usaría un bucle while para manejar un iterable sería si necesita acceder directamente al iterador por algún motivo, p. Necesitaba saltear los elementos en la lista bajo algunas circunstancias.

+2

Saltarse elementos de la lista se puede hacer con continuar.La razón por la que usaría este estilo de while loop es si quería recuperar condicionalmente el siguiente elemento en el ciclo antes de volver a empezar al principio del ciclo. –

Cuestiones relacionadas