Domina un flujo claro para actualizar clientes en Python con un comando update, una refactorización simple y el uso del operador de pertenencia. Verás cómo normalizar el input, crear un método auxiliar privado para evitar repetición y reemplazar el nombre en un string global de clientes de forma segura.
¿Cómo actualizar un cliente con update en Python?
Para habilitar la actualización, se agrega un nuevo comando al menú y se normaliza el input para evitar errores. La clave: convertir el comando a mayúsculas y manejar la opción U para update.
Normaliza el comando con .upper() para evitar rechazar entradas en minúsculas.
Informa al usuario que existe la opción: U de update client.
Pide los nombres y llama a la función update_client con ambos parámetros.
# Normalización del comandocommand =input('What command do you want to use? ')command = command.upper()print('U: update client')# informar la nueva opción# Rama para actualizarelif command =='U': client_name = _get_client_name() updated_client_name =input('What is the updated client name? ') update_client(client_name, updated_client_name)
¿Cómo evitar errores por comandos en minúsculas?
Con command = command.upper() garantizas que un comando en minúsculas no se marque como inválido y fluya hacia la rama correcta de elif.
¿Qué opción de menú guía al usuario para update?
Mostrar un mensaje como U: update client orienta al usuario a elegir la acción adecuada antes de capturar nombres.
¿Cómo refactorizar la captura de nombres con un método auxiliar?
Repetir líneas para pedir el nombre del cliente “no se siente bien”. Por eso se crea un método auxiliar y se marca como “privado” con guion bajo. Así, evitas duplicación y mejoras la legibilidad.
def_get_client_name():returninput('What is the client name? ')# Reutilizaciónclient_name = _get_client_name()updated_client_name =input('What is the updated client name? ')
¿Por qué un método auxiliar privado reduce repetición?
Porque centraliza la lógica de input del nombre del client. Si luego cambias el mensaje o validación, lo haces en un solo lugar y todo el flujo se beneficia.
¿Cómo opera update_client con el operador de pertenencia?
La actualización se basa en tres ideas: usar global clients, verificar existencia con el operador de pertenenciain y reemplazar el nombre en el string que almacena la lista de clientes. Tras cambiar, se muestra la lista para confirmar.
Acceso global: global clients para modificar la variable compartida.
Verificación: if client_name in clients: asegura que el cliente exista.
Reemplazo con coma: mantener la coma tras el nombre actualizado por consistencia.
Retroalimentación: si no existe, se informa que el cliente no está en la lista.
defupdate_client(client_name, updated_client_name):global clients
if client_name in clients:# Reemplazo considerando la coma de separación clients = clients.replace(client_name +',', updated_client_name +',') list_clients()# mostrar la lista de clientes tras actualizarelse:print('Client is not in client list.')
Ejemplo de uso en terminal: ejecutar Python main py, elegir update, ingresar el nombre actual (por ejemplo, Ricardo) y después el nuevo nombre (James). El resultado muestra la lista actualizada: Pablo y James en lugar de Pablo y Ricardo.
¿Te gustaría ver una validación adicional del input o más ejemplos de reemplazo en cadenas? Cuéntalo en los comentarios y qué parte quieres profundizar.
El método replace, solo busca el nombre, no es necesario agregar las comas (’,’)
def update_client(client_name, updated_client_name):
global clients
if client_name inclients: # clients = clients.replace(client_name +',', updated_client_name +',') clients = clients.replace(client_name, updated_client_name)else:print('Client is not in clients list')
Creo que pone el nombre seguido de coma, para no reemplazar nombres parciales, por ejemplo busca Ana y remplaza Juana, pero si ya en la lista hubiera una Anamaria, terminaria siendo Juanamaria, y la idea era que remplace solo el nombre de Ana
@oblitasss apoyo tu aporte
Estaba checando que aunque se ingrese un nombre que sea incorrecto nos va a seguir pidiendo el Input para hacer el Update, en dado caso si agregamos el input para updated_client_name dentro del if de la función update_client() ya no nos va a pedir el input en caso de insertar un nombre que no esté en la lista y así terminar la ejecución:
def update_client(client_name): global clients
if client_name inclients: updated_client_name =input('What is the updated client name? ') clients = clients.replace(client_name +',', updated_client_name +',')else:print('Client not found in the client\'s list')
Estaba viendo justo eso, y como podía solucionarlo. Muchas gracias.
excelente aporte!! no lo habia notado
Si hicieran una competencia de quien es el mejor profesor de Platzi yo voto por David
🤔🤔
Es excelente profesor, pero cada profe tiene su fórmula y su manera de explicar, aunque también como alumnos tenemos diferentes formas de aprender por lo que hay quienes no se acomoden con el ritmo de Aroesti.
Código actualizado con las sugerencias de los demás compañeros.
Espero les sirva 😎👍
#proyecto_final
clients ='Pablo, Ricardo' #creamos el string
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
print('[C]reate client')print('[U]pdate client')print('[D]elete client')def create_client(client_name): global clients #Utilizamos global para definir que la variable es la globarl, es decir la que definimos con pablo y ricardo
clients_minusculas = clients.lower() #convertimos la cadena de texto en minusculas y la guardamos en otra variable para no diferenciar entre "Pablo" y "pablo"if client_name not inclients_minusculas: #si el nombre del cliente no esta en clients_minusculas
_add_coma() #ejecutamos la funcion _add_coma para agregar una coma y un espacio
clients += client_name.capitalize() #adicionamos el nuevo string pero con la funcion capitalize para poner el primer caractér en mayuscula
else:print('Client already exists') #Sino mostramos un mensaje al usuario
def update_client(client_name): global clients
if(client_name in clients ): updated_client_name =input('What is the updated client name?') clients = clients.replace(client_name, updated_client_name)else:print('Client is not in client list')def _add_coma(): #el nombre de la función comienza con un guión bajo para establecer que será una funcion privada
global clients
clients +=", " #se agrega una coma y un espacio al string para separar los nuevos valores
def list_clients(): #función que muestra la lista de clientes
global clients
print(clients) #imprimimos el string clientes
def _get_client_name():returninput('What is the client name?') #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" client_name =_get_client_name()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
list_clients() #Ejecutamos la funcion listar clientes
elif command =='u': client_name =_get_client_name()update_client(client_name)list_clients() elif command =='d': #si el dato ignresado por el usuario es "d" pass
else:print('Invalid command')input() #Escribimos un input para que el programa haga una pausa y no cierre la ventana hasta recibir un enter
super
Gracias
Ejemplo de la función replace llamada sobre un str en el mundo de game of thrones
Está cool, aunque no solo vi la primera y la segunda temporada hace como 6 años y ya no recuerdo el nombre de los personajes, jejeje 🐉
Código utilizando listas:
clients =['Pablo','Ricardo']def welcome():print('Welcome!','*'*20,'What would you like to do?','C -> Create client','U -> Update client','D -> Delete client','>>>', sep='\n', end=' ')def create_client(client_name): global clients # Take global variable clients to use it
if client_name not inclients: clients.append(client_name) # Add element client_name to the list
else:print('{client} is already in the client\'s list'.format(client=client_name))def list_clients():"""Join the elements of the list clients through the string ', ' """print(', '.join(clients))def update_client(client_name): global clients
if client_name inclients: updated_client_name =input('What is the updated client name:\n>>> ') client_index = clients.index(client_name) clients[client_index]= updated_client_name
returnprint('Client is not in clients list')def _get_client_name():returninput('What is the client name?:\n>>> ')if __name__ =='__main__':welcome() user_decision =input() user_decision = user_decision.upper()if user_decision =='C': client_name =_get_client_name()create_client(client_name)list_clients() elif user_decision =='D': pass
elif user_decision =='U': client_name =_get_client_name()update_client(client_name)list_clients()else:print('Invalid command')
Acordaros de correr el código con python3 main.py
Okey... Aquí esta mi aporte :D
Y Aquí el código:
# -*- codign: utf-8-*-# Variables&Constglobal clients
clients =['Miguel','David']def run():"""Start the software"""show_title()read_element()def show_title():"""Show custom title of 'Platzi Seller'""" title =('██████╗ ██╗ █████╗ ████████╗███████╗██╗ ███████╗███████╗██╗ ██╗ ███████╗██████╗') complement = title
title +=('\n██╔══██╗██║ ██╔══██╗╚══██╔══╝╚══███╔╝██║ ██╔════╝██╔════╝██║ ██║ ██╔════╝██╔══██╗') title +=('\n██████╔╝██║ ███████║ ██║ ███╔╝ ██║ ███████╗█████╗ ██║ ██║ █████╗ ██████╔╝') title +=('\n██╔═══╝ ██║ ██╔══██║ ██║ ███╔╝ ██║ ╚════██║██╔══╝ ██║ ██║ ██╔══╝ ██╔══██╗') title +=('\n██║ ███████╗██║ ██║ ██║ ███████╗██║ ███████║███████╗███████╗███████╗███████╗██║ ██║') title +=('\n╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚══════╝╚══════╝╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝') # AddStyles break_line =('-'*len(complement)+"\n")*2 title ="{}\n{}\n{}\n".format(break_line, title, break_line)print(title)show_menu()def show_menu():"""Show the menu of 'Platzi Seller'""" options =['List Client','Create Client','Update Client','Delete Client','Exit'] count =0print("Write a number of the next options:")for element inoptions:print("{}. {}".format(count, element))if count <=len(options): count+=1def read_element():"""Execute and make the process of the actions specifics""" option =0while option !=4: input_data =input('\nOption: ')ifinput_data: option =int(input_data) response =action(option)else: response ='No action allowed'print(response)def action(option):"""Select and Action""" response ="Any Action valid"if option ==0: # List response =show_all_clients() elif option ==1: # CreateClient response =create_client() elif option ==2: # UpdateClient response =update_client() elif option ==3: # DeleteClient response =delete_client() elif option ==4: # Exit response ='Good Bye!'return response
def show_all_clients():"""Print all Clients"""return("This is your list:\n{}".format(clients))def __show_all_clients_index(): response ='This is your list:\n'for client inenumerate(clients): response +="{}, ".format(client)print(response)def create_client():"""Create a Client""" name =input("Write a name of the client: ")ifname: clients.append(name)returnshow_all_clients()else:return"The client name is empty"def update_client():"""Update a Client""" response ='Any Change'__show_all_clients_index() index =input('\nWrite the index of the client: ')ifindex: index =int(index)if index >=0 and index <=len(clients): name =input("Write a name of the client: ")ifname: clients[index]= name
response ="Client #{} is updated\n\n{}".format(index,show_all_clients())return response
def delete_client():"""Delete a Client""" response ='Any Change'__show_all_clients_index() index =input('\nWrite the index of the client: ')ifindex: index =int(index)if index >=0 and index <=len(clients): del clients[index] response ="Client #{} is deleted\n\n{}".format(index,show_all_clients())return response
if __name__ =='__main__':run()
Excelente aporte!
q tal amigo como realizas esos bloques en el título
yo ya había resuelto el problema de que el usuario introdujera un comando en minúsculas usado lo aprendido en las primeras clases, pero creo que es mucho mas optima la solución que nos brinda el profesor, aunque no esta mal arreglárselas con lo poco que se sabe.
if command =='C' or 'c': client_name =input('what is the client name?')create_client(client_name)list_clients() elif command =='D' or 'd': pass```
Al contrario, así reforzamos lo aprendido y después lo comparamos con otras formas de resolver un problema. Leer el código de alguién más es muy importante.
Breve explicación del método o función replace().
replace(valorAntiguo, valorNuevo, contador), el contador estable la cantidad de veces que va a ser reemplazado el valorAntiguo, por default es "all" todas las ocurrencias
Gracias :)
💨🌪!
Hola, me pueden ayudar explicándome porfa esta parte del codigo de "update_client(client_name, update_client_name)", como funciona???
if __name__ =='__main__': #punto de entrada
_print_welcome() command =input() command = command.upper()if command =='C': client_name =_get_client_name()create_client(client_name)list_clients() elif command =='D': pass
elif command =='U': client_name =_get_client_name() update_client_name =input('What is the updated client name? ')update_client(client_name, update_client_name)-->Esta parte???list_clients()else:print('Invalid command')```
Es una función que verifica que el cliente que se quiere actualizar existe, si el cliente existe lo actualiza (remplaza el nombre antiguo por el nuevo)
Gracias por tu respuesta, pero son los parámetros que no los entiendo.
Muchas gracias...
Hola, llevo el codigo hasta donde vamos en los videos, pero no se porque no me toma la esta condicion
cuando ingreso un nombre que no esta, lo deja pasar sin mostrar el mensaje
¡Hola, @Andresfrabla! ⚡
¿Podrías mostrarnos todo el código? Por favor. Así sabremos cómo ayudarte.
Hola! tengo una pregunta.
Yo definí todas las funciones sin parámetros y me funcionan correctamente. Es por una buena practica que definiste las funciones con parámetros o es a gusto del desarrollador? Gracias!!!
¿Puedes pasar tu codigo?
Hola a todos!
Por alguna razón aunque mi script corre, cuando intento usar alguno de los comandos falla, he revisado varias veces pero lo encuentro escrito como en la clase, lo que pareciera que indica el error es que no aceptara la instrucción IN en los IF, como si mi input no fuera un string.
El error que muestra es el siguiente:
Traceback (most recent call last):
File "main.py", line 53, in <module>
create_client(client_name)
File "main.py", line 8, in create_client
if client_name not in clients:
TypeError: 'in <string>' requires string as left operand, not NoneType
Comparto mi código:
clients ='fabiana, stephen, '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():print(clients)def update_client(client_name, updated_client_name): global clients
if client_name inclients: updated_client_name =input('What is the updated client name? ') clients = clients.replace(client_name +',', updated_client_name)_add_comma()else:print('Client is not in client\'s list')def _add_comma(): global clients
clients +=', 'def _get_client_name():input('What is the client name? ')def _print_welcome():print('WELCOME TO PLATZI VENTAS')print('*'*50)print('What would you like to do today?')print('[C]reate client')print('[U]pdate client')print('[D]elete client')print('[V]iew clients list')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 =='D': pass
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 =='V':list_clients()else:print('Invalid Command')
De antemano gracias!
hola, probé tu código y solucione el problema pero al momento de crear el contacto no lo guarda, simplemente al guardarlo queda como None.
verifica que al momento de preguntar por el nombre del cliente este quede guardado en una variable que lo almacene.
clients =["fabiana, stephen,"]def create_client(client_name): global clients
if client_name not inclients: clients.append(client_name)create_client(client_name)else:print('Client already is in the client\'s list')def list_clients():print(clients)def update_client(client_name, updated_client_name): global clients
if client_name inclients: updated_client_name =input('What is the updated client name? ') clients = clients.replace(client_name +',', updated_client_name)else:print('Client is not in client\'s list')def _get_client_name(): pass
def welcome():print('WELCOME TO PLATZI VENTAS')print('*'*50)print('What would you like to do today?')print('[C]reate client')print('[U]pdate client')print('[D]elete client')print('[V]iew clients list')if __name__ =="__main__":welcome() command=input() command=command.upper()if command =='C':input('What is the client name? ') client_name=_get_client_name()create_client(client_name)list_clients() elif command =='D': pass
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 =='V':list_clients()else:print('Invalid Command')
si lo solucionas por favor, explica como lo hiciste. ✌
El programa no me actualiza el nuevo nombre para el usuario.
Aqui el codigo.
Debes poner el código completo, posiblemente el detalle esté en la función update_client
¡Hola! Una forma distinta de dejar el upper sobre la variable command es de la siguiente forma:
command =input().upper()
Se deja directamente para que no se tenga que crear primero la variable command y ahí si volverla en mayúsculas.
buena Esa...
Al actualizar no es necesario colocar que reemplace las comas, para tenerlo en cuenta ;)
Mi idea sería incluir el updated_client_name dentro del if de la funcioón update_client:
def update_client(client_name):"""Update an existing client""" global clients
if client_name inclients: updated_client_name =input('What is the updated client name:\n>>> ') clients = clients.replace(client_name +',', updated_client_name +',')returnprint('Client is not in clients list')
Éste me parece un código más claro ya que si ponemos el nombre del cliente y no existe, no nos preguntará el nombre del cliente actualizado, si no que nos dirá directamente que el cliente a actualizar no existe.
.
Aún así, yo hubiese preferido utilizar listas en vez de strings (adjunto mi código en otro comentario)
Seria bueno poner estos dos input
client_name =_get_client_name()updated_client_name =input('What is the updated client name?')
como parte de la funcion update_client para hacer la validación de si el nombre existe al capturar el 1er input.
Ahora si se escribe un nombre que no existe, igual te hace escribir la actualización, aunque no la vaya a hacer.
aquí mi código con la función de eliminar el cliente
clients =[]def _get_name():returnstr(input('Enter the Client Name: '))def create_clients(clients): name =_get_name() clients.append(name)def list_clients(clients):print(clients)def update_client(clients): name =_get_name() client_idx = clients.index(name) new_name =str(input('Enter the new name: ')) clients[client_idx]= new_name
def remove_client(clients): name =_get_name() clients.remove(name)def _print_welcome():whileTrue:print('WELCOME TO PLATZI VENTAS')print('*---'*6)print('')print('What do you want to do?') option_selected =str(input('''
Select an option
[a]AddClient[l]ListClients[u]UpdateClient[d]Delete client
[e]Exit''')) option_selected.lower()if option_selected =='a':create_clients(clients) elif option_selected =='l':list_clients(clients) elif option_selected =='u':update_client(clients) elif option_selected =='d':remove_client(clients)else:breakif __name__ =='__main__':_print_welcome()```
Excelente aporte, da gusto leer código como este. Siento que estoy leyendo a un verdadero programador.
Muchas gracias por compartir. Nunca pares de aprender!!!
¡Muchas gracias por tu comentario! ¡Nunca pares de aprender!