Aprende a dominar las while loops en Python con ejemplos claros: desde una cuenta regresiva hasta validación de entradas del usuario. Evita el temido infinite loop, usa break cuando haga sentido y finaliza programas de forma segura con sys.exit. Todo explicado paso a paso y con errores reales resueltos con claridad.
¿Qué es una while loop y cómo evitar un infinite loop?
Una while loop itera mientras una condición sea verdadera; a diferencia de las for loops, que recorren una secuencia. Es potente, pero si la condición nunca se vuelve falsa, aparece un infinite loop. Esto sucedió al incrementar en lugar de decrementar la variable de control. Además, se mencionó que estos loops pueden consumir memoria y provocar errores como Stack Overflow. Incluso hay una calle llamada One Infinite Loop como guiño a este error.
¿Cómo luce una cuenta regresiva en código?
# Cuenta regresiva básicadefcuenta_regresiva(n):while n >0:print(n) n -=1
Itera mientras n > 0.
Imprime y decrementa n en cada vuelta.
Si n es negativo, no entra al loop.
¿Qué causa un infinite loop al contar hacia arriba?
# Versión con bug: se incrementa n y la condición nunca se vuelve falsadefcuenta_regresiva(n):while n >0:print(n) n +=1# Bug intencional: provoca un infinite loop si n inicia positivo
La condición n > 0 siempre es verdadera si n crece.
Se detiene con Control + C, pero es mejor prevenir el error.
¿Cómo aplicar while loops para validar input en Python?
Cuando un programa necesita un dato obligatorio, una while loop permite repetir la pregunta hasta que el usuario proporcione un valor válido. Python usa None para indicar “no hay valor”.
¿Cómo validar hasta obtener un nombre?
# Versión base: pedir el nombre del cliente hasta recibir un valor no vacíodefget_client_name(): client_name =None# None: sin valorwhilenot client_name: client_name =input("nombre del cliente: ")return client_name
Se inicializa con None para indicar ausencia de dato.
La condición while not client_name repite hasta que haya texto.
Mejora la robustez de la interacción con el usuario.
¿Qué errores comunes y soluciones se muestran en el código?
Aparecieron dos tipos de errores: sintaxis (por ejemplo, mala indentación que impide ejecutar código tras un break) y lógica (como validar “no hay nombre” cuando realmente el valor es la palabra exit). También hubo un bug por usar una variable distinta a la que controla la condición del loop, dejando la condición siempre verdadera.
¿Cómo añadir una salida temprana con exit y break?
Se agregó una salida escribiendo exit. Para terminar el programa correctamente se usa sys.exit y se importa con import sys.
import sys
defget_client_name(): client_name =NonewhileTrue: client_name =input("nombre del cliente: ")# Salida temprana del loopif client_name =="exit": client_name =None# Corrección lógica: forzar ausencia de valorbreak# Si hay nombre válido, salir del loopif client_name:break# Fuera del while: decidir si terminar el programaifnot client_name: sys.exit()return client_name
Se mueve la validación fuera del bloque que se rompe con break para que sí se ejecute.
Al escribir exit, se restablece a None para que sys.exit termine el programa.
Se evita depender de Control + C y se documenta la intención con claridad.
¿Qué habilidades y conceptos se ponen en práctica?
Diferencia entre for loops (secuencia) y while loops (condición).
Control de flujo con break y condiciones booleanas.
Validación de entradas con bucles y manejo de None.
Depuración: distinguir entre errores de sintaxis y de lógica.
Prevención de infinite loops y efectos en memoria, como Stack Overflow.
Buenas prácticas: probar casos límite como números negativos.
Flujo de salida del programa con sys.exit e import sys.
¿Te gustaría ver más patrones de validación con while o casos de salida temprana? Comparte tus dudas y ejemplos en los comentarios.
import sys
clients ='luisa, juan,'def create_client(client_name): global clients
if client_name not inclients: clients += client_name
_add_comma()else:print('Client already is in the client\'s list')def list_clients(): global clients
print(clients)def updated_client(client_name, updated_client_name): global clients
if client_name inclients: clients = clients.replace(client_name +',', updated_client_name +',')else:print('Client is no it client\'s list')def delete_client(client_name): global clients
if client_name inclients: clients = clients.replace(client_name +',','')else:print('Client is not in client\'s list')def search_client(client_name): clients_list = clients.split(',')for client inclients_list:if client != client_name:continueelse:returnTruedef _add_comma(): global clients
clients +=','def _print_welcome():print('WELCOME TO PLATZI VENTAS')print('*'*50)print('What would you like to do today ? ')print('[C]reate client')print('[L]ist client')print('[U]pdated client')print('[D]elete client')print('[S]earch client')def _get_client_name(): client_name =Nonewhile not client_name: client_name = str.lower(input('What is the client name ? '))if client_name =='exit': client_name =Nonebreakif not client_name: sys.exit()return client_name
if __name__ =='__main__':_print_welcome() command =input() command = command.upper()if command =='C': client_name =_get_client_name()create_client(client_name)list_clients() elif command =='L':list_clients() elif command =='U': client_name =_get_client_name() updated_client_name = str.lower(input('What is the updated client name ? '))updated_client(client_name, updated_client_name)list_clients() elif command =='D': client_name =_get_client_name()delete_client(client_name)list_clients() elif command =='S': client_name =_get_client_name() found =search_client(client_name)iffound:print('The client is in the client\'s list')else:print('The client: {} is not in our client\'s list'.format(client_name))else:print('Invalid command')
Excelente aporte
Pense en un texto que le explique al usuario de esa opción
>>> -------------------- # Insert 'exit' to break
>>> Client's name:
Hay que tener en cuenta que el while not client_name valida si no se agrega ningun valor, si se ingresan solo espacios, el los va a tomar como el nombre.
Para solucionar esto y limpiar aun asi los espacios en caso de que se vayan antes o despues de un nombre real, se puede hacer agregando
client_name =input("What is the client name? ").strip()
Buenisímo!!
Genial, aunque en lugar de strip yo le agregaría rstrip y lstrp, para el caso de nombre compuestos.
Como súper curiosidad, si declaras una variable con valor "None", el tipo de esa variable será "NoneType"
Descubri un pequeño error en el codigo que me gustaria corregir aca:
para el caso en el que por ejemplo se agregara el nombre "Tatiana" y acto seguido se agregara el nombre "Ana" el sistema detectara que ya existe puesto que esta contenido en la cadena del nombre anterior, para arreglar esto se corrige la condicion del create_client al concatenar una coma (,) la cual es la que indica la separacion de nombre para indicar en donde termina un nombre completo.
`def create_client(client_name):
global clients
if client_name+',' not inclients: clients += client_name
_add_comma()else:print('Client already exists')`
no lo habia notado, gracias por el aporte
Si caen un un infinitive loop pueden detener la ejecución del código en la consola pulsando Ctrl + C
David es un profesor idóneo, ¡¡por que no fuiste mi profesor en el pasado!!!
Un excelente profesor. Me ha iluminado mucho
Un truco en el interactive shell. Este tiene un historial, puedes accerder a el pulsando la fecha hacia arriba (la tecla), e ir metiendo los ultimos fragmentos de codigo sin tener que escribirlos nuevamente
Esto funciona igual con los comandos de la terminal
Pasar client_name a none es como hacer trampa, quedaria mejor que el sys.exit() se agregue a la condicional "if client_name == 'exit':"
if client_name == 'exit':
sys.exit()
saludos. excelente prof.
En este paso me hubiese servido mas seguir la configuración del profesor, ya que para capturar los nombres indefinidamente me toco hacer un loop por cada opción, sin embargo me sigue gustando mas mi personalización.
Adicionalmente incluí en la función Welcome un While que permite ejecutar el programa hasta que el usuario decida salir, ya sea en la captura del nombre o en la toma de decisiones iniciales. Esto implico crear la función name_Break, que evalua el nombre ingresado y si es "Exit" termina el programa!!
import sys
clients =['Pablo','Ricardo']def Create_Cliente(client_name): global clients
if client_name not inclients: clients.append(client_name)print(clients)print('Client added')else:print('The name already is in clienṭ\'s list!!!')def delete_client(client_name): global clients
clients.remove(client_name)print(clients)print('Client removed')def update_client(client_name):
global clients
if client_name not inclients:print('The name you pick is not in the clienṭ\'s list!!!')else: updated_client_name =input('Enter the new name: ') clients.remove(client_name) clients.append(updated_client_name)print(clients)print('Client Updated')def search_client(client_name):
global clients
for client inclients:if client_name == client:returnTrueelse:continuedef _finder(client_name): client_finded =search_client(client_name)ifclient_finded:print('The client {} is in the client\'s list'.format(client_name))else:print('The client {} isn\'t in the client\'s list'.format(client_name))def break_Name(client_name):if client_name =='Exit':print('Good Bye') sys.exit() pass
def welcome(): command =None client_name =Nonewhile command !='E':
global clients
print('Welcome to Platzi Sales')print('')print('*'*50)print('')print('What would you like to do today?')print('')print('[C]reate Client')print('[U]pdate')print('[S]earch')print('[D]elete client')print('[E]xit')print('')print('At any time you can enter "Exit" to escape the program') command =input('Please tell us your option: ')if command =='Exit':break_Name(command) command = command.upper()if(command =="C"):while client_name ==None or client_name =='': client_name =input('Please enter the name you want to create: ')break_Name(client_name)Create_Cliente(client_name)elif(command =="D"):while client_name ==None or client_name =='': client_name =input('Please enter the name you want to delete: ')break_Name(client_name)delete_client(client_name)elif(command =='U'):while client_name ==None or client_name =='': client_name =input('Please enter the name you want to Update: ')break_Name(client_name)update_client(client_name)elif(command =='S'):while client_name ==None or client_name =='': client_name =input('please enter the name you want to Seach: ')break_Name(client_name)_finder(client_name)elif(command =='E'):print('Good Bye')breakelse:print('Invalid option: ')if __name__ =='__main__':welcome()
parece que estamos en la misma ruta, te veo en todos los cursos jaja 👍
Vamos a darle duro jajaja
Con Ctrl + L también pueden limpiar la terminal
No me funciono
Es para sistemas unix (Linux y osx)
la funcion getClientName() me quedó diferente y funcional
import sys
print('\n\nHello, this is your software practice!')clients ='Carlos, Frank, 'print('*'*70)print('What would you like to do?')print('[C]reate a new client')print('[S]earch a client')print('[D]elete a client')print('[U]pdate a client')"""*****************************FUNCTIONS********************************""""""*****************************FUNCTIONS********************************"""def getClientName(): clientName =Nonewhile not clientName: clientName =input('What\'s the client name? ')if clientName =='exit': sys.exit()return clientName
def addComma(): global clients
clients +=', 'def clientList(): global clients
print(clients)def createClient(clientName): global clients
if clientName not inclients: clients += clientName
addComma()else:print('Client already is in the client\'s list')def searchClient(clientName): global clients
if clientName inclients:print('The client '+ clientName +' is in the client\'s list')else:print('The client '+ clientName +' isn\'t in the client\'s list')def deleteClient(clientName): global clients
if clientName inclients: clients = clients.replace(clientName +',','')print('This client has been deleted!')else:print('This client not exist in the client list!')def updateClient(clientName, newClientName): global clients
if clientName inclients: clients = clients.replace(clientName +',', newClientName +',')else:print('Doesn\'t exist this client name! ')"""*****************************FUNCTIONS********************************""""""*****************************FUNCTIONS********************************""""""***************************IF STATEMENTS******************************""""""***************************IF STATEMENTS******************************"""command =input()if command =='C': clientName =getClientName()createClient(clientName)clientList()elif command =='S': clientName =getClientName()searchClient(clientName)elif command =='D': clientName =getClientName()deleteClient(clientName)clientList()elif command =='U': clientName =getClientName() newClientName =input('What\'s the new client name? ')updateClient(clientName, newClientName)clientList()else:print('INVALID KEY')"""***************************IF STATEMENTS******************************""""""***************************IF STATEMENTS******************************"""
Creo que necesitab oir que los errores son normales <3
Dando el salto fuera del script de código.
.
Que emocionante comenzar a utilizar scripts que se ejecutan fuera de nuestro código para llegar a establecer comunicación con otros protocolos.
.
¡Backend aquí vamos!
.
Mi código:
def _get_client_name(): client_name =Nonewhile not client_name: client_name =input(f'\n\tWhat is the client name?:')if client_name =='exit': client_name =Nonebreakif not client_name: sys.exit()return client_name
While loops
Repite un statement hasta que la condición que le estamos pasando sea falsa, debemos tener cuidado con los loops infinitos.
Stack Overflow
Aparte de ser una de las comunidades más grandes de developers y dónde puedes encontrar muchas respuestas y ayudas para tu código, es cuando un programa está intentando utilizar más memoria de la que tiene disponible.
Recuerden que el return es el fin de la función por lo tanto si agregan cualquier cosa dentro de la función después del return el programa no funcionará.
Es importante también utilizar nuestra función dentro de una variable para poder utilizar el valor que regresa return
.
En la clase lo hicimos al utilizar:
client_name =_get_client_name()# si solamente escribieramos la función:_get_client_name()# El valor devuelto por la función no podría ser utilizado por la siguiente función:create_client()
Agregando validación en caso de que el cliente escriba exit en mayuscula
Agregando el método capitalize() también funciona:
if client_name =='exit'.capitalize():
Aprovechando las posibilidades de los loops definí una variable “finish” con valor False y cree un While loop en donde puse toda la parte de las opciones de forma que pueda usar los comandos de manera continua y el programa solo termine cuando ingrese el comando “EXIT”.
if __name__ =='__main__': finish =False_print_welcome()while(finish ==False):_print_options() command =input() command = command.upper()if command =='C': client_name =_get_client_name()create_client(client_name)list_clients() elif command =='R':list_clients() elif command =='U': client_name =_get_client_name() updated_client_name =input('What is the updated client name? ')update_client(client_name,updated_client_name)list_clients() elif command =='D': client_name =_get_client_name()delete_client(client_name)list_clients() elif command =='S': client_name =_get_client_name() found =search_client(client_name)iffound:print('The client is in the clients list')else:print('The client: {} is not in our clients list'.format(client_name)) elif command =='EXIT': finish =Trueelse:print('Invalid command')
También aproveche para separar la impresión de las opciones del mensaje de bienvenida para no estar imprimiendo lo todo el tiempo.
def _print_welcome():print('WELCOME TO PLATZI VENTAS')def _print_options():print('*'*50)print('What would you like to do today?')print('[C]reate client')print('[R]ead clients')print('[U]pdate client')print('[D]elete client')print('[S]earch client')
Cuando hizo el ejercicio antes del Bug, tuve un error de sintaxis, en visual code, solo por el hecho que había cometido un error en los espacios previos al iniciar el renglón, alguien podría explicarme porque pasa eso?, en html no tengo esos problemas.
En Python la indentación y los espacios son importantes, ya lo había dicho David en clases anteriores, y en HTML no te pasa porque HTML NO ES UN LENGUAJE DE PROGRAMACIÓN. Te recomiendo que veas los cursos de fundamentos de programación para que entiendas mas fácil los demás cursos.
No es que porque HTML no sea un lenguaje de programación que no tenes problemas con la indentación: JavaScript es un lenguaje de programación, pero en este da lo mismo la indentación.
Python lee la indentación para saber cómo agrupar los bloques de código.
quién esté usando linux el
sys.exit()
al parecer funciona correctamente en Mac, pero en linux se debe colocar:
syst.exit(0)
Muy cierto en Windows es necesario poner el valor 0
compruebe la versión de python con la que interpreta el fichero, estoy usando python3 y no me da inconvenientes
Si tienen el error
IndentationError: unexpected indent
Deben verificar que esten dando los espacios correctos despues de usar " : ", ya que python es muy estricto con eso
Cierto...lo mejor es usar tab para realizar la identación correctamente.