Como programadores tenemos el objetivo de crear procesos simples pero funcionales, que no se rompan al momento de usarlos o que no provoquen que los teléfonos de nuestros usuarios se apaguen por usar nuestra aplicación.
Y uno de los muchos problemas que pueden causar esto es el mal uso de bucles dentro de nuestro código, por eso (y porque es parte de una tarea en el curso de fundamentos de Python en platzi) hoy aprenderemos como usar correctamente el bucle while sin matar nuestro programa en el proceso.
Primero repasemos que es un bucle while (si ya sabes que es un bucle while solo míralo directamente)
Imagina que tienes un algoritmo el cual inicializa una variable en 0 y necesitas incrementar esa variable en pasos de 1 en 1 hasta que esa variable tenga como valor el numero 10, si escribiéramos ese algoritmo en Python se miraría así.
numero = 0
numero += 1
numero += 1
numero += 1
numero += 1
numero += 1
numero += 1
numero += 1
numero += 1
numero += 1
numero += 1
Ahora agreguemos un print en cada incremento para ver el valor de la variable, nuestro codigo queda así.
numero = 0
numero += 1print(numero)
numero += 1print(numero)
numero += 1print(numero)
numero += 1print(numero)
numero += 1print(numero)
numero += 1print(numero)
numero += 1print(numero)
numero += 1print(numero)
numero += 1print(numero)
numero += 1print(numero)
Pero cuando programamos sistemas reales no podemos permitirnos copiar y pegar líneas de código para que se repita una determinada acción, para eso usamos los bucles.
Los bucles nos permiten repetir una serie de acciones (algoritmo), un bucle es repetir algo, aplicando el concepto de bucle existe una keyword (palabra reservada) en Python llamada while (while solo es un tipo de bucle).
Usando el bucle while en nuestro código anterior este pasa a verse así.
numero = 0while numero < 10:
numero += 1print(numero)
El bucle while va a repetir el algoritmo dentro de el hasta que la condición se deje de cumplir, este es un funcionamiento similar a un condicional if ,pero con while una vez terminado el algoritmo se vuelve a evaluar la condición para saber si se vuelve a ejecutar el código dentro del bucle o no.
El funcionamiento del algoritmo anterior es el siguiente…
Antes que todo analicen este código.
contraseña_admin = "123"
contraseña_ingresada = input(":")
whileTrue:
ifnot contraseña_ingresada == contraseña_admin:
print("Esa no es la contraseña del administrador >:(")
nueva_contraseña_solicitada = input(":")
else:
print("Bienvenido administrador !")
breakprint("Entraste en el sistema !")
La condición para que tu bucle siga iterando debe de estar siempre en el lugar que le corresponde a la condición del bucle, en nuestro código anterior pusimos directamente un True en el lugar de la condición y esto es algo que se debe de evitar en la medida de lo posible ya que aunque pueda funcionar creeme sera mas difícil en un futuro leer y sabe cual es el objetivo del bucle, si tu vez este código…
whileTrue:
no sabes para que se usa el bucle, solo sabes que es un bucle, pero si vez este código…
whilenot contraseña_ingresada == contraseña_admin:
sabes a la perfección que el bucle es para validar que la contraseña que se le esta solicitando al usuario sea la misma contraseña del administrador para así dejarlo entrar al sistema.
Pero este sigue siendo un bucle infinito, aunque en algún momento se ingrese la contraseña correcta nunca podrá ingresar el usuario al sistema y si ya te diste cuenta del porque, felicidades ya dominas el siguiente paso.
Ahora, tiene que ser mutable, a que me refiero con esto? pues esto quiere decir que los datos de la condición tienen que poder cambiar dentro del algoritmo del bucle ya que de esta manera la condición del bucle puede ser True o False, si la condición sigue siendo True por siempre el bucle continuara repitiéndose una y otra vez y así obtienes un bucle infinito, el perfecto algoritmo para que tu aplicación deje de funcionar ya que nunca va a volver a avanzar. Esto no aplica siempre, hay casos en los cuales puedes usar bucles infinitos pero definitivamente no es en la mayoría de casos y te invito a investigar cuando si puedes usar un bucle infinito, te daré unas pistas listeners y game loops
Aplicando esto a nuestro código ya no usaríamos esta instrucción…
nueva_contraseña_solicitada = input(":")
ya que esa variable nunca se usa , esta siendo declarada sin sentido pero si necesitamos guardar la contraseña que ingrese el usuario, y que variable ya tenia antes la contraseña que ingresaba el usuario ?? exacto…
contraseña_solicitada = input(":")
Y con estos 2 simples pasos ya sabes usar un bucle while de forma correcta, ahora si quitamos el if innecesario nuestro código se ve así…
contraseña_admin = "123"
contraseña_ingresada = input(":")
whilenot contraseña_ingresada == contraseña_admin:
print("Esa no es la contraseña del administrador >:(")
nueva_contraseña_solicitada = input(":")
print("Entraste en el sistema !")
Claro se puede mejorar mas haciéndolo un poco mas complejo y seguro para aun caso en la vida real, pero esta es la forma mas simplista y funcional de como funciona un sistema de login y ahora tu usuario administrador podrá ingresar al sistema, todo gracias a que usaste correctamente un bucle while pero y si no fuera necesario usar un bucle while ??
Esto me lleva al ultimo paso.
Como programador tienes una infinidad de herramientas que puedes usar para resolver un problema, no hay una única manera de resolver un problema pero tienes que escoger y no siempre un bucle es la solución a que el usuario no ingrese bien su contraseña o no siempre es la solución al problema que se te esta presentando.
Y como se si debo usar un bucle?? pues debes usarlo si necesitas que un algoritmo se repita y si o si, pero incluso si es así no deberías de empezar a escribir tu bucle hasta que no tengas claro 2 cosas…
→ Ejemplos de otras formas de escribir el código que hicimos
# ejemplo antes visto
contraseña_admin = "123"
contraseña_ingresada = input(":")
whilenot contraseña_ingresada == contraseña_admin:
print("Esa no es la contraseña del administrador >:(")
nueva_contraseña_solicitada = input(":")
print("Entraste en el sistema !")
# ejemplo funcional
deflogin(contraseña_ingresada):
contraseña_admin = "123"return (contraseña_admin==contraseña_ingresada)
contraseña_ingresada = input("Tu Contraseña: ")
while login(contraseña_ingresada) != True:
contraseña_ingresada = input("Contraseña incorrecta intenta de nuevo: ")
# ejemplo mixto
deflogin(contraseña_admin,contraseña_ingresada):
if (contraseña_admin==contraseña_ingresada):
print("Login realizado")
returnTrue
else:
print("Login rechazado...")
returnFalse
contraseña_admin = '123'while login(contraseña_admin,contraseña_ingresada=input("Tu Contraseña: ")) == False:
continue# ejemplo recursivo
deflogin(contraseña_admin,contraseña_ingresada):
if (contraseña_admin==contraseña_ingresada):
print("Login realizado")
returnTrue
else:
print("Login rechazado...")
return login(contraseña_admin,input("Contraseña: "))
login(
contraseña_admin='123',
contraseña_ingresada=input("Contraseña: ")
)
<h1>Referencias</h1>
-> Te recomiendo ver este foro hay una buena discusión que tiene que ver con el tema