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
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.
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
Entonces, ¿podríamos decir que el 'While' es algo más obsoleto en python? – Fabio
@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. –
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()
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
+1 Esta es una buena respuesta también. –
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
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)
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
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
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.
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. –
- 1. Directriz: while vs for
- 2. ¿Qué es más eficiente en Javascript: while o for statements?
- 3. For-loop vs while loop en R
- 4. Cuándo usar atributos vs. cuándo usar propiedades en python?
- 5. anidado WHILE loops en Python
- 6. Cuándo usar for-each y cuándo usar apply-templates en xslt?
- 7. Cuándo usar class versus dict en python?
- 8. ¿Cuándo sabe cuándo usar TreeSet o LinkedList?
- 9. For-Loops en Python
- 10. PC Lint while (TRUE) vs for (;;)
- 11. PHP - If/else, for, foreach, while - ¿sin llaves?
- 12. Cuándo usar interfaces o clases abstractas? Cuándo usar ambos?
- 13. Sincronización, ¿Cuándo o no usar?
- 14. Cuándo usar InvalidOperationException o NotSupportedException?
- 15. Cuándo usar strncpy o memmove?
- 16. Cuándo usar (o no usar) un delegado
- 17. python -c y `while`
- 18. ¿Por qué Python tiene "else" en "for-else" y "while-else"?
- 19. Cuándo usar referencias débiles en Python?
- 20. Big O para while loops
- 21. Python: bucles for anidados o "Next"
- 22. Cuándo usar os.name, sys.platform o platform.system?
- 23. Diferencia entre for (;;) y while (true) en C#?
- 24. Python: cuándo usar subprocesos frente a multiprocesamiento
- 25. Python: cuándo usar pty.fork() contra os.fork()
- 26. ¿`break 'funciona solo para` for`, `while`,` do-while`, `switch' y para declaraciones` if`?
- 27. bucle for en Python
- 28. Python - Cuándo usar el archivo vs abrir
- 29. ¿Por qué el bucle en range() en Python es más rápido que usar un bucle while?
- 30. Python equivalente a Perl's while (<>) {...}?
+1 Esto es lo que * quería * decir :) –
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
@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 **. –