from - Cuándo usar "while" o "for" en Python
libreria__ future__ python (6)
Estoy encontrando problemas cuando debería usar un ciclo while o un ciclo for
en Python. Parece que las personas prefieren usar un bucle for
(¿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.
Considere procesar iterables. Puedes hacerlo con un ciclo for
:
for i in mylist:
print i
O bien, puedes hacerlo con un ciclo while:
it = mylist.__iter__()
while True:
try:
print it.next()
except StopIteration:
break
Ambos bloques de código hacen fundamentalmente lo mismo básicamente de la misma manera. Pero el bucle for
oculta la creación del iterador y el manejo de la excepción StopIteration
para que usted no tenga que lidiar con ellos.
La única vez que puedo pensar que usaría un ciclo while para manejar un iterable sería si necesita acceder al iterador directamente por alguna razón, por ejemplo, necesita omitir elementos en la lista bajo algunas circunstancias.
En primer lugar, existen diferencias entre el bucle for en python y en otros lenguajes. Mientras que 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 es más fácil leer.
Para los bucles generalmente se utilizan 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 tomará (por ejemplo, el algoritmo de ordenación de burbujas , que realiza bucles siempre que los valores no están ordenados)
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
Sí, hay una gran diferencia entre el tiempo y el tiempo.
La instrucción for itera a través de una colección u objeto iterable o función de generador.
La instrucción while simplemente gira hasta que una condición es False.
No es preferencia. Es una cuestión de cuáles son sus estructuras de datos.
A menudo, representamos los valores que queremos procesar como un range
(una lista real) o xrange
(que genera los valores). Esto nos da una estructura de datos a medida para la declaración for .
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 ciclo for .
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 instrucción for .
Si no tiene una estructura de datos ordenada para iterar, o si no tiene una función de generador que impulse su procesamiento, debe usar while .
The 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 fácil de leer que esto:
i = 0
while i <= 10:
print i
i = i + 1
while
es útil en escenarios donde la condición de interrupción no depende lógicamente de ningún tipo de secuencia. Por ejemplo, considere interacciones impredecibles:
while user_is_sleeping():
wait()
Por supuesto, podría escribir un iterador apropiado para encapsular esa acción y hacerla accesible a través for
, pero ¿cómo serviría eso para la legibilidad?
En todos los demás casos en Python, use for
(o una función apropiada de orden superior que encapsula el ciclo).
¹ suponiendo que la función user_is_sleeping
devuelve False
cuando es falso, el código de ejemplo podría reescribirse como el siguiente for
ciclo:
for _ in iter(user_is_sleeping, False):
wait()