Pasar de strings a listas en Python simplifica el manejo de clientes y mejora la legibilidad. Aquí verás cómo refactorizar un pequeño CRUD paso a paso usando métodos de lista como append, enumerate, index y remove, además de operadores de pertenencia y formateo con format.
¿Cómo refactorizar de strings a listas en Python?
Usar listas en lugar de strings elimina la necesidad de concatenar texto y gestionar separadores. Ahora los clientes viven en una lista y cada operación trabaja de forma directa sobre la estructura de datos.
Reemplaza concatenación por métodos de lista. Usa append en vez de sumar strings.
Itera con índice incluido.enumerate entrega índice y valor al mismo tiempo.
Actualiza por posición. Con index obtienes el índice y reasignas en la lista.
Elimina por valor.remove borra el elemento sin necesitar el índice.
Mantén la interfaz. Cambia la implementación interna, no los comandos que el usuario ejecuta.
¿Qué ajustes aplicar en create, list y update?
El objetivo es dejar de manipular texto y usar operaciones nativas de listas. Los operadores de pertenencia como in y not in funcionan igual en listas que en strings, pero ahora operan sobre elementos, no sobre caracteres.
¿Cómo agregar elementos con append?
Sustituye la concatenación y cualquier lógica de “añadir coma”. Si el cliente no existe, agrégalo con append.
clients =['Pablo','Ricardo']defcreate_client(client_name):global clients
if client_name notin clients: clients.append(client_name)
Idea clave: en lugar de construir un string, modificas la lista en sitio con append.
¿Cómo iterar con enumerate y mostrar índice?
Para listar clientes con su “ID” temporal, usa la built-in functionenumerate que devuelve par (índice, valor) durante el ciclo.
Placeholders con format: las llaves {} marcan dónde insertar variables con format.
Ventaja: sabes en qué índice está cada cliente sin cálculos adicionales.
¿Cómo actualizar con index y reasignación?
Para cambiar el nombre de un cliente, primero localiza su posición con index y luego reasigna en ese índice.
defupdate_client(client_name, updated_name):global clients
index = clients.index(client_name) clients[index]= updated_name
Fortaleza de las listas: permiten reasignar valores en una posición concreta, algo que los strings no permiten.
¿Cómo eliminar y buscar clientes de forma limpia?
Eliminar y buscar ahora son más directos porque la lista ya define límites entre elementos. Se puede quitar la función de “añadir coma” y cualquier división por separadores.
¿Cómo eliminar con remove sin índice?
Si conoces el nombre, no necesitas el índice: remove elimina la primera ocurrencia del valor.
Práctico: elimina por valor, ideal cuando el índice no está a mano.
¿Cómo buscar con operadores de pertenencia y control de flujo?
Recorre la lista y regresa True al encontrar coincidencia. Los return detienen la función en el momento exacto.
defsearch_client(client_name):for client in clients:if client != client_name:continuereturnTruereturnFalse
not in / in: verifican pertenencia de forma legible.
Control de flujo:return termina la función y entrega el resultado inmediatamente.
Prueba en consola: listar muestra índices (0: Pablo, 1: Ricardo), crear agrega, buscar confirma existencia y borrar quita elementos. La funcionalidad externa se mantiene mientras la implementación interna mejora en claridad.
¿Te fue útil este enfoque con listas? Comenta qué parte te gustaría profundizar o qué otra estructura de datos quieres ver aplicada en el programa de plats y ventas.
index() es un método que busca la posición de un elemento en una lista y nos regresa su posicion. Y si hay varios elementos iguales, nos regresa el primer elemento
Buen aporte
Gracias por la referencia
Le doy un 10 a este profesor, su pasion su explicacion uffff ahora es que me encanta la programacion
Estoy de acuerdo, yo también le doy un 10 a este profesor, esa pasión por enseñar me encanta.
10 de 10 :D
Código actualizados:
import sys
clients =['luisa','juan']def create_client(client_name): global clients
if client_name not inclients: clients.append(client_name)else:print('Client already is in the client\'s list')def list_clients():for idx, client inenumerate(clients):print('{} : {}'.format(idx, client))def updated_client(client_name, updated_client_name): global clients
if client_name inclients: index = clients.index(client_name) clients[index]= updated_name
else:print('Client is no it client\'s list')def delete_client(client_name): global clients
if client_name inclients: clients.remove(client_name)else:print('Client is not in client\'s list')def search_client(client_name):for client inclients:if client != client_name:continueelse:returnTruedef _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_name = str.lower(input('What is the updated client name ? '))updated_client(client_name, updated_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')
Gracias!
# pip install tabulate
# from tabulate import tabulate
def list_clients(): global ClientsifClients:print('Our Clients are :') show=[]for idx,name inenumerate(Clients): show.append([idx+1,name])print(tabulate(show,headers=['N°','Name'],tablefmt='fancy_grid'))else:print(' I don´t have Clients in this moment')
## console output
OurClients are :╒══════╤════════╕
│ N° │ Name │
╞══════╪════════╡
│ 1 │ jose │
├──────┼────────┤
│ 2 │ juan │
├──────┼────────┤
│ 3 │ jorge │
╘══════╧════════╛
Muchas gracias! Excelente aporte.
buenos días, cómo estan?
me pueden ayudar por favor con una consulta… ¿cuál es la razón por la que ya no se debe usar el
global clients
cuando definimos la función para listar los clientes? Si igual se esta llamando en la función
Las variables globales en Python se usan para evitar errores secundarios involuntarios.
Si no declaras la variable como “global” será siempre local (esto es diferente en otros lenguajes de programación).
Te recomiendo leer: global vs local en Python
Hola Sebastián, es simple, global solo se utiliza cuando vas a modificar un objeto global dentro de una función. Como solo vas a listar los clientes, no vas a modificar nada por lo que no es necesario usarla ;)
Que pasaría si de casualidad tuvieras por accidente dos nombres en la lista ex. clientes['juan','juan','pedro'] y quisieras usar el método de actualizar juan 🤔🤔
Toma la primera coincidencia, en este caso la posicion 0, la segunda coincidencia (posicion 1) seguiria igual.
++En lugar de:++
print('{}: {}'.format(idx, client))
++Podemos usar mejor++
print(f'{idx}: {client}')
Yeah, a mí también me gusta la segunda opción, es más fácil de leer.
Les comparto mi código como va, tiene algunas funcionalidades mas que el del profesor!
import sys
clients =['Pablo','Ricardo']def Create_Cliente(client_name): global clients
if client_name not inclients: clients.append(client_name)print('Client added')else:print('The name already is in clienṭ\'s list!!!')list_clients(clients)def delete_client(client_name):
global clients
clients.remove(client_name)print('Client removed')list_clients(clients)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: ') index = clients.index(client_name) clients[index]= updated_client_name
print('Client Updated')list_clients(clients)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))list_clients(clients)def break_Name(client_name):if client_name =='Exit':print('Good Bye') sys.exit() pass
def list_clients(clients):print('')print('-°'*28)print('')for idx, client inenumerate(clients):print('{}: {}'.format(idx, client))print('')print('-°'*28)print('')def welcome(): command =None client_name =None count_Welcome =0while command !='E': command =None client_name =None count_Welcome +=1print('*'*56)print('')print('EXECUTION NUMBER {}'.format(count_Welcome))
global clients
print('')if count_Welcome ==1:print('-'*15+'WELCOME TO PLATZI SALES!!!'+'-'*15)print('')print('')print('*'*56)print('')print('What would you like to do?')print('')print('[C]reate Client')print('[U]pdate')print('[S]earch')print('[L]ist')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: ')print('')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 =='L'):list_clients(clients)break_Name(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()
Muy bien explicado y desarrollado este asunto de las listas.
Es interesante que mientras contenido se aprende, mas fácil y lógico se vuelve programar.
Les recomiendo en Esta pagina web donde podemos ver mas ejemplos y casos acerca de como usar listas para basarse en la estructura de datos.
Que buena pagina gracias.
Hola @sampar01, esa pagina web que recomiendas usa Python 2, te recomiendo que no la uses pues ahora lo recomendable es aprender directamente Python3 que es la versión actual con soporte y que incluye muchos cambios de sintaxis que no se usan en python 2.
Te recomiendo este tutorial oficial de Python -
Mi código hasta ahora, le agregue el modulo os para limpiar la consola y tener un menú mas limpio.
Para linux:
import os
os.system('clear')
Para windows:
import os
os.system('cls')
import sys
import os
clients =['Alejo','Alvaro']def create_client(client_name): global clients
ifnot(client_name in clients): clients.append(client_name)else: os.system('clear')print('The client is already in client\'s list.')print('[Enter] to continue]')input()def update_client(client_name): global clients
if(client_name in clients): updated_client =input('Insert a new name: ') index = clients.index(client_name) clients[index]= updated_client
else: os.system('clear')print('The client isn\'t in client\'s list.')print('[Enter] to continue]')input()def delete_client(client_name): global clients
if(client_name in clients): clients.remove(client_name)else: os.system('clear')print('The client isn\'t in client\'s list.')print('[Enter] to continue]')input()def list_clients():for idx , client inenumerate(clients):print(f"{idx}:{client}")def search_client(client_name):if client_name inclients:returnTrueelse:returnFalsedef get_client_name(): client_name =Nonewhilenot(client_name): client_name =input('Insert the client name: ')return client_name
def _print_welcome():print('Welcome to Platzi Ventas.')print('*'*25)print('Menu:')print('[C]reate client.')print('[U]pdate client.')print('[D]elete client.')print('[L]ist clients.')print('[E]xit.')print('Insert a command: ')if __name__ =='__main__': opt =Nonewhile(opt !='E')or(not opt):_print_welcome() opt =input().upper()if(opt =='C'): os.system('clear')print('Creating a new client...') client_name =get_client_name()create_client(client_name)elif(opt =='U'): os.system('clear')print('Updateing a client...') client_name =get_client_name()update_client(client_name)elif(opt =='D'): os.system('clear')print('Deleting a client...') client_name =get_client_name()delete_client(client_name)elif(opt =='L'): os.system('clear')list_clients()print('[Enter] to continue]')input()elif(opt =='S'): client_name =get_client_name() found =search_client(client_name)if(found):print(f'The client {client_name} is in client\'s list.')else:print(f'The client {client_name} isn\'t in client\'s list.')elif(opt =='E'): os.system('clear') sys.exit()else: os.system('clear')print('Try again! Invalid command.')print('[Enter] to continue]')input() os.system('clear')
El buscar cliente también puede ser
def search_client(client_name):return client_name in clients```
Por qué para la funciOn search si intera la lista clients con un for loop.
Pero en create, update y delete puede interar con solo condicional if?
Yo intenté interar en la función search con el condicional if y me arrojó error!
Muestra el error y así te podemos ayudar mejor.
Si te muestra un error en 'continue' es por que esa sentencia solo se puede hacer en bucles como for y no en un if
Hola, en la función de update_client el index es una función???
index = client.index(client_name)
Como funciona el client.index???
Muchas gracias...
Si amigo, es una funcion de la clase lista.
Recibe como parametro un valor y te retornara el indice del mismo en la lista.
Yo hice un poco distinta la función search y no retorna ningún valor, directamente se imprime desde ahí, también en lugar de recorrer la lista directamente pregunto si encuentra el elemento.
def search_client(client_name): global clients
if client_name inclients:print('The client {} is in the client list'.format(client_name))else:print('The client {} isn\'t in the client list'.format(client_name))
TIP Es mas organizado trabajar con una funcion llamada run() para introducir todo el bloque de codigo donde se llaman las funciones y en el entry point unicamente hacer el llamado de la funcion es una buena practica y es lo que se hace a nivel profesional
Muy cierto compañero, se me hace extraño que el profesor no lo haya hecho hasta este punto del curso.
import sys
clients =['pablo','ricardo']def create_client(client_name): global clients
if client_name not inclients: clients.append(client_name)else:print('Client already is in the client\'s list')def list_clients():for idx, client inenumerate(clients):print('{} : {}'.format(idx, client))def updated_client(client_name, updated_client_name): global clients
if client_name inclients: index = clients.index(client_name) clients[index]= updated_name
else:print('Client is no it client\'s list')def delete_client(client_name): global clients
if client_name inclients: clients.remove(client_name)else:print('Client is not in client\'s list')def search_client(client_name):for client inclients:if client != client_name:continueelse:returnTruedef _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_name = str.lower(input('What is the updated client name ? '))updated_client(client_name, updated_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')
Tengo un pequeño problema en el List_clients en el que me muestra la lista como esta definida en la variable. Este es mi código
import sys
clients =['franco','matias','luis','tomas','rebeca']def create_client(client_name): global clients
if client_name not inclients: clients.append(client_name)else:print("El cliente ya esta en la lista.")def update_client(client_name, updated_client_name): global clients
if client_name inclients: index = clients.index(client_name) clients[index]= updated_client_name
else:print("El cliente no se encuentra en la lista.")def delete_client(client_name): global clients
if client_name inclients: clients.remove(client_name)else:print("El cliente no se puede borrar por que no esta en la lista.")def search_client(client_name):for client inclients:if client != client_name:continueelse:returnTruedef list_clients():for idx, client inenumerate(clients):print(f"{idx}: {client}")def _print_welcome():print("Bienvenido")print("*"*50)print("Que es lo primero que va a hacer?")print("[C]rear cliente")print("[L]eer clientes")print("[A]ctualizar")print("[B]orrar cliente")print("[S]earch client")def _get_client_name(): client_name =Nonewhile not client_name: client_name =input("Cual es nombre del cliente? ")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 =="B": client_name =_get_client_name()delete_client(client_name)print(clients) elif command =="A": client_name =_get_client_name() updated_client_name =input("Cual es el nombre del cliente actualizad: ")update_client(client_name, updated_client_name)print(clients) elif command =="L":print(clients) elif command =="S": client_name =_get_client_name() found =search_client(client_name)iffound:print(f"El cliente {client_name} se encuentra en la lista de clientes")else:print(f"El cliente: {client_name} no se encuentra en la lista de clientes")else:print("Ingrese un comando valido")```
hola amigo, no había visto tu problema, espero hayas podido solucionarlo, pero si no es así, te dejo la solución.
en tu menú de comandos, solo mandas a imprimir tu lista CLIENTS
elif command =="L":print(clients)
por lo contrario tendría que mandar a llamar tu función list_client()
elif command =="L":list_clients()
y listo, solo eso, espero haberte ayudado. ñ.ñ
Excelente!!
la funcion search puede ser de la siguiente forma:
def search_name(name): global clients
return name in clients