Domina las iteraciones en Python con un enfoque práctico y claro: usa for loop y while loop de forma efectiva, comprende range como iterator en Python 3 para ahorrar memoria, y aplica break y continue en un caso real de búsqueda de clientes con split y formato de cadenas mediante .format.
¿Qué son las iteraciones en Python y cuándo usar for o while?
Las iteraciones permiten ejecutar un bloque repetidamente. En Python, las dos formas principales son:
for loop: itera sobre una secuencia. Ideal cuando conoces los elementos o el rango.
while loop: repite hasta que una condición sea falsa. Útil cuando el fin depende de un estado.
Ventajas destacadas:
Código legible y mantenible. Sustituye patrones antiguos como el uso de “go to”.
Convención de variable i: se usa comúnmente como contador, pero el nombre es libre.
¿Cómo funciona range como iterator eficiente?
En Python 3, range devuelve un objeto iterator, no crea la lista completa de números.
Beneficio clave: mejor uso de memoria al no generar secuencias gigantes en el instante.
Ejemplo básico:
for i inrange(10):print(i)# Imprime 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
¿Qué hacen las keywords break y continue?
continue: salta el resto del bloque actual y pasa a la siguiente iteración.
break: termina por completo el ciclo actual.
Uso típico: filtrar elementos con continue y, al encontrar lo buscado, usar return o break para detener.
¿Cómo implementar una búsqueda de clientes con for y split?
Se parte de una estructura simple: los clientes están en un solo string separados por comas. Para iterar, se convierte a lista con split y se recorre con for loop.
Habilidades aplicadas:
Manejo de cadenas y listas:split(',') para obtener la lista de clientes.
Control de flujo: uso de continue para saltar casos no coincidentes.
Retorno de valores: la función regresa True si encuentra al cliente; False en caso contrario.
Ejemplo de función:
clients ="Pablo,Ricardo"defsearch_client(client_name): clients_list = clients.split(",")for client in clients_list:if client != client_name:continue# sigue buscandoreturnTrue# encontradoreturnFalse# no encontrado
Uso dentro del flujo principal con una variable booleana:
client_name = get_client_name()# usa la función global input para pedir el nombrefound = search_client(client_name)if found:print('El cliente "{}" está en la lista de clientes.'.format(client_name))else:print('"{}" no está en nuestra lista de clientes.'.format(client_name))
¿Cómo estructurar el flujo con return y valores booleanos?
Todas las funciones regresan un valor: sin return, devuelven None; aquí se define explícitamente un booleano.
return finaliza la función: en cuanto se encuentra el cliente, se detiene el recorrido.
Variable de estado found: facilita decisiones posteriores con if.
¿Cómo dar retroalimentación al usuario con format y placeholders?
Uso de .format con llaves {} como placeholder para insertar variables en un mensaje.
Ventaja: mensajes claros y reutilizables sin concatenaciones complejas.
¿Qué buenas prácticas y contexto histórico conviene recordar?
Las iteraciones no solo resuelven problemas, también mejoran la claridad del código.
Legibilidad ante todo: los ciclos modernos reemplazan patrones antiguos como “go to”, haciendo el programa comprensible.
Separadores por comas y formato CSV: almacenar datos como "nombre1,nombre2" es común; está relacionado con CSV (Comma Separated Values), base de muchos datos tabulares en herramientas como Excel o spreadsheet.
Trabajo incremental: primero define el comando de búsqueda, luego implementa la función, y al final prueba con casos existentes y no existentes: por ejemplo, buscar "Pablo" y luego "Billy" para validar ambos escenarios.
¿Tienes otra forma de implementar la búsqueda o quieres optimizar el flujo con break en lugar de return? Comparte tus ideas y comenta tu enfoque.
A partir de Python 3.6 (PEP 498 : )
se puede usar format asi para este caso:
elif command == ‘S’:
client_name = _get_client_name()
found = search_client(client_name)
iffound:print(f'The client {client_name} is in the client\'s list')else:print(f'The client {client_name} is not in our client\'s list')
gracias!!
Buen aporte
Entiendo que se aplican los conceptos del for, pero yo lo hice de otra forma que seria mas directa, sin necesidad de dividir el string ni realizar el for
def search_client(client_name):return client_name in clients
retorna True si encuentra el valor en el string de lo contrario retorna False
Buen aporte compadre, Gracias.
Como dijeron en otro comentario, esto puede tener bugs, como que el nombre sea 'abl' y de acuerdo a tu código te devolvería True, por lo que no sería correcto.
Hay algo que no entendí, cuando ponemos "clients.split(',') porque en esta funcion no es necesario hacer GLOBAL a la variable CLIENTS?
¡Hola @thejb! No es necesario usar el keyword global en este caso porque no vas a modificar el objeto clients, solo vas a generar otro a partir de él. Mientras no modifiques un objeto global, la palabra reservada es innecesaria ;)
interesante pregunta, no me habia dado cuenta.
Mi código actualizado y comentado de este ejercicio, espero les sirva 😎👍
#proyecto_final
clients ='Rogelio, Paco, Sebastian, Adrian' #creamos el string con los nombres de los clientes
def _print_welcome(): #funcion para dar el mensaje de bienvenida
print('Welcome to Monares POS')print('what would you like to do today?')print('*'*52) #imprimimos el caracter "*"52 veces
#Mostramos el menu al usuario
print('[C]reate client')print('[R]ead client\'s list ')print('[U]pdate client')print('[D]elete client')print('[S]earch client')def verify_client(client_name):"""
Esta funcion sirve para verificar si un cliente se encuentra en el string o no.Recibe un parametro, el nombre del cliente y devuelve un valor positivo si el nombre
se encuentra en el string y viceversa
"""
global clients
if client_name inclients:returnTrueelse:returnFalsedef _client_not_found_tollgate():"""
Esta funcion sirve para mostrar un mensaje preestablecido si un cliente no se encuentra
en el string de los clientes
"""
print("Client is not in client\'s list")def create_client(client_name):"""
Esta función sirve para agregar un cliente al string de la lista
"""
global clients #Utilizamos global para definir que la variable es la global, es decir la que definimos con pablo y ricardo
if(verify_client(client_name)): #Ejecutamos la funcion verify client, si la cadena del nombre del cliente está en el string etonces...print('Client already exists') #Mostramos un mensaje al usuario
else:_add_coma() #Si no, ejecutamos la funcion _add_coma para agregar una coma y un espacio al último nombre
clients += client_name #adicionamos el nuevo string pero con la funcion capitalize para poner el primer caractér en mayuscula y seguir con el formato
def read_client_list():"""
función que imprime la lista de clientes
"""
global clients
print(clients) #imprimimos el string clientes, es decir la lista de clientes
def update_client(client_name):"""
Función que sirve para actualizar el nombre de un cliente, recibe un parametro que es el string del nombre del cliente a editar
"""
global clients #Utilizamos global para definir que la variable es la globarl, es decir la que definimos con pablo y ricardo
if(verify_client(client_name)): #Si el cliente se encuentra registrado entonces... updated_client_name =input('What is the updated client name?').capitalize() #Pedimos al usuario que ingrese el nuevo nombre de cliente
clients = clients.replace(client_name, updated_client_name) #Ejecutamos la funcion replace, la cual recibe dos parametros, el string a reemplazar
#y el string con el cual se remplazara al anterior
else:_client_not_found_tollgate() #sino, ejecutamos la funcion _client_not_found_tollgate() para mostrar el mensaje que no se ha encontrado el cliente(string)def delete_client(client_name):"""
Función para borrar el cliente(Remplazar por una cadena vacía)"""
global clients
if(verify_client(client_name)): #Si el cliente está registrado, entonces... clients = clients.replace(client_name +', ','') #Remplazamos el nombre concatenado con una , y un espacio y lo remplazamos por una cadena vacía
else:_client_not_found_tollgate() #sino, ejecutamos la funcion _client_not_found_tollgate() para mostrar el mensaje que no se ha encontrado el cliente(string)def search_client(client_name):"""
Función para buscar a un cliente
"""
global clients
clients_csv = clients.split(', ') #CSV: comma-separated values |La función split separa los valores cuando encuentra el caracter/string que recibe como parámetro
for client inclients_csv: #Es como el foreach |Por cada nueva_variable(que usaremos internamente) que esté en CSV(por ejemplo)if client != client_name: #Se ejecuta una comparación, si el cliente no coincide entonces...continue #continue, fuerza a la siguiente iteración que suceda
else:returnTrue #caso contrario retornamos un valor truedef _add_coma(): #el nombre de la función comienza con un guión bajo para establecer que será una funcion privada
"""
Función que sirve para agregar una coma y un espacio para separar los substrings
"""
global clients
clients +=", " #se agrega una coma y un espacio al string para separar los nuevos valores
def _get_client_name():"""
Función que sierve para obtener el nombre del cliente con el formato capitalizado
"""
returninput('What is the client name?').capitalize() #guardamos en la variable client_name el valor de los caracteres que ingresa el usuario hasta recibir un enter
if __name__ =='__main__': #funcion main
_print_welcome() #ejecutamos la funcion que da el mensaje de bienvenida
command =input().lower() #guardamos el valor del dato ingresado en la variable command pero lo convertimos a miunsculas para realizar la accion si presiona "C" o "c"if command =='c': #si el comando es igual al caracter "c" procedemos a realizar los pasos de create/crear
client_name =_get_client_name() #Ejecutamos la función para obtener el nombre del cliente
create_client(client_name) #Ejecutamos la funcion crear cliente y enviamos como parametro el valor de la variable que almacena lo que digitó el usuario
read_client_list() #Ejecutamos la funcion listar clientes
elif command =='r': #si el comando es igual al caracter "r" procedemos a realizar los pasos de read/leer
read_client_list() #Ejecutamos la funcion listar clientes
elif command =='u': #si el comando es igual al caracter "u", procedemos a realizar los pasos de update/actualizar
client_name =_get_client_name() #Ejecutamos la función para obtener el nombre del cliente
update_client(client_name)read_client_list() #Ejecutamos la funcion listar clientes
elif command =='d': #si el dato ingresado por el usuario es "d" procedemos a realizar los pasos de delete/eliminar
client_name =_get_client_name() #Ejecutamos la función para obtener el nombre del cliente
delete_client(client_name)read_client_list() #Ejecutamos la funcion listar clientes
elif command =='s': ##si el dato ingresado por el usuario es "s" procedemos a buscar al cliente con el nombre ingresado
client_name =_get_client_name() #Ejecutamos la función para obtener el nombre del cliente
found =search_client(client_name) #Guardamos en la variable found lo que retrona la función search_client
iffound:print(f'The client: {client_name}, has been found') #si la función devuelve un true mostramos el mensaje que se ha encontrado el cliente
else:print(f'The client: {client_name}, has not been found')#viceversa
else:print('ERROR: Invalid command') #Si el usuario no digita alguna de nuestras opciones entonces mostramos un mensaje de error
input() #Escribimos un input para que el programa haga una pausa y no cierre la ventana hasta recibir un enter
Vaya, eso si que ayuda!
de verdad, esto si es super útil
Por qué esta vez no necesitó declarar global clients dentro de la función?
Por lo que entendí de la clase y con el comentario de @nescep es que solo cuando se va a editar la variable dentro de la función se declara como global, si solo se va a usar como lectura no.
¡Muchas gracias por la respuesta! Yo también tenía la misma duda y por lo que decís pareciera que es así sí, pues cuando lista los clientes no usa la lista como global dentro de la función.
Si estás usando Python 3.10 puede hacer uso de la nueva feature match-case.
def main()->None:_print_welcome() command =input() command = command.upper() match command:case"C": client_name =_get_client_name()create_client(client_name)list_clients()case"L":list_clients()case"D": client_name =_get_client_name()delete_client(client_name)list_clients()case"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()case"S": client_name =_get_client_name() is_client_found =search_client(client_name)ifis_client_found:print("The client is in the client's list")else:print(f"The client {client_name} is not in the client's list")case_:print("Invalid command")
no es más corto el codigo de esta forma?
for client inclients_list:if(client_name == client):returnTruereturnFalse
lo que dices es cierto! Pero en este caso, el profe David utilizo la negacion para explicar de forma sencilla el keyword 'continue'
No, porque a la primera iteracion, retornaria falso (Dado el caso que el nombre que buscas no esta en la primera posicion) y se acabaria el bucle, ya que cuando haces un return, se termina el la funcion
Nuevamente dejo mi código... al código que dejo el profe le hice una modificación, cree una función que mira el resultado de la ejecución de la función que hace la búsqueda y determina que imprimir, esto solo para sacar de la función welcome la decision, creo yo que en la bienvenida no debería estar el final de la ejecución del programa:
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 welcome():
global clients
print('Welcome to Platzi Sales')print('*'*50)print('What would you like to do today?')print('[C]reate Client')print('[U]pdate')print('[S]earch')print('[D]elete client') command =input('Please tell us your option: ') command = command.upper()if(command =="C"): client_name =input('Please enter the name you want to create: ')Create_Cliente(client_name)elif(command =="D"): client_name =input('Please enter the name you want to delete: ')delete_client(client_name)elif(command =='U'): client_name =input('Please enter the name you want to Update: ')update_client(client_name)elif(command =='S'): client_name =input('please enter the name you want to Seach: ')_finder(client_name)else:print('Invalid option: ')if __name__ =='__main__':welcome()
Buena idea!
No sería más sencillo que la función "search_client" sólo fuera un if que evaluara si el nombre del cliente está en el string clients???
Algo así :
If client_name in clients:
return True
No seria correcto pues tendira un "bug" por ejemplo si clients tuviera el valor de
clients ='pablo,ricardo,'
entonces la instruccion
if client_name inclients:returnTrue
devolveria True no siempre con nombres de clientes por ejemplo si client_name tendría el valor de 'pab' o 'rica' tambien devolveria True.
Lo que hace la condicional de ese if es que busca si en el string 'clients' existe 'client_name' como sub string, es decir que simplemente busca alguna ocurrencia de una cadena en otra. No se fija si estas estan delimitadas por algun separador o si tienen sentido.
Sí, yo hice lo que mencionas y me funcionó correctamente, pero debes tener en cuenta una comparación "==" y no una in, de lo contrario como menciona @rc_catunta, existirían algunos bug..
RECOMENDACION IMPORTANTE:
No crear el string (clients) con espacios después de la coma
clients = ‘Pablo,Ricardo, claudia, yenni’
clients_list = clients.split(’,’)Esta funcion generaria un error, por que separa con un espacio después del segundo termino.le pega un espacio " " a los elementos del split()[‘Pablo’, ’ Ricardo’, ’ claudia’, ’ yenni’]``````
Aprende a usar for loops nivel super sayayin 7 - ¡Dios!.
.
Pasa de 🐍 ➡️ 🐉 con for, while y generadores
.
Los loops es de lo más utilizado en la programación por lo que es muy importante aprenderlo bien y sacarle provecho. Les dejo diferentes maneras de aplicar un for loop. No te quedes con lo básico y domina los loops mirando el video increíble de una Pycon.
.
1.- Sintaxis fundamental de un loop for:
for valor insecuencia:Bodyoffor
.
2.- Utilizando un rango con range():
# generando un rango con valores de 0 al número indicado
for i inrange(10): # genera una secuencia 0-9 pass
# estableciendo los valores de la secuencia en range()range(start, stop, step_size)print(range(10)) # range(0,10)print(list(range(10))) # [0,1,2,3,4,5,6,7,8,9]print(list(range(2,8))) # [2,3,4,5,6,7]print(list(range(2,20,3))) # [2,5,8,11,14,17]
.
3.- Combinando range() con len()para obtener la longitud de una lista de elementos:
genre =['pop','rock','jazz']for i inrange(len(genre)):print(i) # 0 # 1 # 2
.
4.- Generando listas, combinando strings con 'for loops:'
genre =['pop','rock','jazz']
# iterate over the list using index
for i ingenre:print('I like', i)# Resultado:I like pop
I like rock
I like jazz
.
@youtube
Solo reformule el condicional para evitar el uso del continue.
Leyendo los comentarios me di cuenta de que no es necesario utilizar la palabra reservada global en clients.split, ya que no se modifica, solo se genera otro objeto a partir de este.
¿Por qué en la función search_cliente no es necesario poner global a la variable clients?
¡Hola @Robert_SMZ! Porque la palabra reservada global solo es necesaria cuando vas a modificar un objeto global en una función. En este caso solo lo lees por lo que no hay problema ;)
Si no encuentra el nombre de mi cliente, por qué el código
retorna el valor False si no está declarado en ningún lado??
Porque en python, todas las funciones que no se les especifíque retornar, retornarán "None".
Y ya que si nunca encuentra el nombre nunca retorna True, por lo cual se devolvería un None y procede a entrar en el "else" del condicional (esto no dice que se hay devuelto un Falso, sino que no se devolvió un valor verdadero).
sos un grande monchito!
Código de esta clase con comentarios incluidos de lo que se ha creado clase por clase
clients ='pablo,ricardo,'def create_client(client_name): global clients
if client_name not inclients:#Clase13Condicional para verificar que el cliente no este en la lista
clients += client_name
#Clase13_add_comma()else:#Clase13print('Client already is in the client\'s list')#Clase13- imprime en la terminal que el cliente ya se encuentra en la lista de clientes
def list_clients():#esta funcion no recibe ningún parámetro, solo lista los clientes
global clients
print(clients)def update_client(client_name, update_client_name): global clients
if client_name inclients: clients = clients.replace(client_name +',', update_client_name +',')else:print('Clients is not in clients list')def delete_client(client_name):#Clase17 solo necesitamos el nombre del cliente
global clients
#Clase17if client_name inclients:#Clase17 clients = clients.replace(client_name +',','')#Clase17: seleccionamos el nombre del cliente con su coma y lo sustituimos por un string vacio
#Clase17else:print('Clients is not in clients list') #Clase17def search_client(client_name):# Clas19 función que recibe como argumento/parametro client_name
client_list = clients.split(',')#Clase19 funcion split nos permite dividir un string en una lista --los objetos de una lista ---- mejor usar un CSVfor client inclient_list: #Clase19if client != client_name: #Clase19continue #Clase19else: #Clase19returnTrue #Clase19def _add_comma(): global clients
clients +=','def __print_welcome(): #Clase13print('*'*8)print('Welcome') #Clase13print('*'*8) #Clase13print('What would you like to do today? ') #Clase13print('[C]reate client') #Clase13print('[L]ist clients')print('[U]pdate client') #Clase16print('[D]elete client') #Clase13print('[S]earch client') #Clase19#refactorizamos, donde generamos un metodo auxiliar que regresa el nombre del cliente
def _get_client_name(): #Clase16returninput('What is the client name?') #Clase16if __name__ =='__main__':__print_welcome() command =input() command = command.upper() #Clase16if command =='C': #Clase13# client_name =input('What is the client name? ') #Clase13 client_name =_get_client_name() #Clase16create_client(client_name) #Clase13list_clients() #Clase13 elif command =='L':list_clients() elif command =='D': #Clase client_name =_get_client_name() #Clase17delete_client(client_name) #Clase17- funcion que borre el nombre del cliente: delete_client
list_clients() elif command =='S': #Clase19 client_name =_get_client_name() #Clase19 queremos encontrar el nombre del cliente
found =search_client(client_name) #Clase19 funcion search client va a tener un valor de regreso
iffound: #Clase19print('The client is in the client\'s list') #Clase19else:print('The Client: {} is not our client\'s list'.format(client_name)) #Clase19 manipulación de string con format, si el cliente no esta en nuestra lista de clientes replazar con
elif command =='U':# client_name =input() client_name =_get_client_name() update_client_name =input('What is the update client name') #Clase16update_client(client_name, update_client_name)list_clients() #Clase16else:print('Invalid command')
excelente curso deberia uno d empezar en python con este, ya que va uno haciendo mientras se va aprendiendo, en un proyecto, en los demas cursos, son teoria y ejemplos que uno no saben para que pueden servir
El curso básico de Python me parece excelente para comenzar y este también excelente para reforzar los conceptos e irlos aplicando, deberían de ponerlos en serie, siento que están separados y que más estudiantes no se pueden beneficiar de ambos cursos como podrían.
¿ continua y pass es lo mismo?
Porque puse pass y el código sigue funcionando normal
continue*
Hey!
No, no son lo mismo. La diferencia es que <continue> fuerza a la siguiente iteración que suceda mientras que <pass> simplemente no hace nada pero el procesamiento sigue su curso
Ánimo!
Para los que tengan dudas sobre la variable “global”
a =1# Uses global because there is no local 'a'def f(): print 'Inside f() : ', a
# Variable'a' is redefined as a local
def g(): a =2 print 'Inside g() : ',a
# Uses global keyword to modify global 'a'def h(): global a
a =3 print 'Inside h() : ',a
# Global scope
print 'global : ',a
f()print 'global : ',a
g()print 'global : ',a
h()print 'global : ',a