Aprende a encapsular lógica en funciones y a controlar el flujo en Python con claridad. Aquí verás cómo usar la palabra clave global, entender el scope o namespace, crear una función auxiliar "privada" con underscore y aplicar la convención de dejar dos líneas entre funciones. Además, se muestra cómo listar clientes antes y después de una operación para verificar cambios.
¿Cómo encapsular lógica con funciones en Python?
Encapsular evita repetir código y hace el programa más legible. Se propone mover la lógica de “añadir un cliente” a una función llamada create_client que recibe el parámetro client_name y modifica la variable global clients mediante la palabra clave global. Se sugiere crear una función auxiliar _add_coma para añadir la coma al final del registro.
# Se asume que 'clients' es una variable global previamente declarada.defcreate_client(client_name):global clients
# Añade el nombre del cliente a 'clients'.# Ejemplo (según la estructura de 'clients'):# clients += client_name _add_coma()passdef_add_coma():global clients
# Añade una coma al final del registro de clientes.# Ejemplo:# clients += ','pass
Encapsulación en funciones para modularidad.
Parámetros claros: client_name.
Uso correcto de global para variables compartidas.
Función "privada" con underscore para tareas auxiliares.
Convención: dos líneas en blanco entre funciones.
¿Qué es una variable global y el scope o namespace?
Una variable global como clients no es accesible dentro de una función sin declarar global. Esto se debe al scope o namespace: cada función tiene su propio alcance y no ve las variables externas a menos que se indique. Por eso, sin global, el código “no va a correr” y mostrará un error al intentar modificar clients.
global permite usar y modificar la variable definida fuera de la función.
scope o namespace: límite de visibilidad de variables.
Evitar errores por acceso a variables no visibles.
¿Cómo crear una función privada auxiliar con underscore?
Una función con underscore inicial (_add_coma) indica utilidad interna. Sirve para aislar una acción pequeña y repetible, como agregar una coma al final. Esto mejora la legibilidad y mantiene el propósito de cada función claro.
underscore comunica uso interno.
Separación de responsabilidades.
Código más limpio y fácil de probar.
¿Cómo controlar el flujo de ejecución y mejorar la legibilidad?
El flujo ya no es solo de arriba hacia abajo: se orquesta llamando funciones en el orden deseado. Se propone listar los clientes antes y después de crear uno nuevo para confirmar la modificación de la variable global. También se resalta la convención de Python de dejar dos líneas en blanco entre definiciones de funciones para mejor lectura.
deflist_clients():global clients
print(clients)pass# Flujo controlado: listar antes y después.list_clients()# Lista el estado inicial.create_client('David')# Añade un nuevo cliente.list_clients()# Verifica el cambio.
Control del flujo mediante llamadas a funciones.
Verificación del estado antes y después de una operación.
Legibilidad con formato consistente.
¿Cómo listar clientes antes y después de una operación?
La función list_clients imprime el estado de clients. Al llamarla antes y después de create_client, se observa la diferencia y se valida que la operación realmente modificó la variable global.
Observabilidad del cambio en tiempo de ejecución.
Feedback inmediato de la operación.
Impresión simple para depuración.
¿Qué herramientas y prácticas se usaron en la terminal?
Se menciona el uso de vim para abrir el archivo (comando similar a “vim main py”) y la ejecución del script desde la terminal (“Main py”). Además, se muestra cómo partir la pantalla con Tmux para ver código y salida a la vez, lo que acelera la revisión.
Edición rápida con vim.
Ejecución directa desde la terminal.
Pantalla dividida con Tmux para monitoreo.
¿Tienes dudas sobre global, scope o la organización del flujo? Comparte tu pregunta o tu fragmento de código en los comentarios y seguimos la conversación.
clients ='Pablo, Ricardo' #creamos el string
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
_add_coma() #ejecutamos la funcion _add_coma para agregar una coma y un espacio
clients += client_name #adicionamos el nuevo string
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
if __name__ =='__main__': #funcion main
print("Primer lista")list_clients() #Listamos los clientes
print("****************************************************")create_client('Fernando') #ejecutamos la funcion crear cliente
print("Lista despues de ejecutar la función create_client()")list_clients() #Volvemos a ejecutar la funcion listar clientes
print("****************************************************")print('Funcion lambda') #Funcion lambda
"""
Se trata de crear funciónes de manera rápida, just in time, sobre la marcha, para prototipos
ligeros que requieren únicamente de una pequeña operación o comprobación.Por lo tanto, toda funcioón lambda también puede expresarse como una convencional(pero no viceversa) f = lambda argumentos: resultado
"""
f = lambda x,y: x+y
print(f('Hola, soy una función... ','lambda :)'))input() #En este caso la usamos para pausar la ejecución del programa hasta presionar la tecla enter
Muy bien comentado tu código, ¡Felicidades!
Considero que es bastante "reciclar" usando una función como _add_comma()
sería mas sencillo solo una función como:
def create_client(client_name): global clients
clients += client_name +','
¿Qué archivo trabajamos en la clase anterior? No se nos dejó ninguno…
Claro que si, en una de las clases anteriores, main se crea en la clase "presentación del proyecto"
Como vengo de otros lenguajes, y entiendo la importancia de escribir correctamente el código (especialmente en python) me encontré con la herramienta llamada pylint (que me ha gustado bastante, cada vez que la ejecuto me saca como 10 errores XD). Por acá dejo mi código de acuerdo a las indicaciones de pylint
#!/usr/bin/env python"""
New project
"""
def create_client(name, clients):"""
Summary: \n
\t Creates and add a newclient to the client list \n
Arguments: \n
\t name(str):Nameof the newclient \n
\t clients(str):Listof clients \n
"""
clients += name
return clients
if __name__ =='__main__':CLIENTS='pablo,ricardo'print(CLIENTS)CLIENTS=create_client(',david',CLIENTS)print(CLIENTS)
Gracias!
Lo que sucedes es que no reconoce la variable con la que debe de trabajar, es aca donde entra el concepto de variables globales, locales, ya que en el caso de realizar el
la funcion supone que dentro de ella existe una variable local llamada clients, claro esta que este error solo ocurre cuando tratamos de manipular es decir asignar, reasignar, cambiar el valor de la variable, ya que si mostramos un print clients esto se motraria sin ningun error.
No se el porqué pero juro recordar que en Python se podían utilizar variables desde dentro de una función.
Efecto mandela, supongo que debe ser por JavaScript.
Comparalo detalladamente
clients='pablo,ricardo,'def create_client(client_name): global clients
clients += client_name
_add_comma()def list_clients(): global clients
print(clients)def _add_comma(): global clients
clients +=','if __name__ =='__main__':list_clients()create_client('david')list_clients()
Porque a la funcion add_comma la comenzaste con ‘_’ que significa?
Es una nomenclatura para las variables o funciones privadas
eso lo explica en el video anterior titulado: variables y expresiones.
La clase comienza diciendo que retomemos el archivo anterior y la clase anterior se hablo de sumar dos numero y no fue en un archivo
¡Hola Sergio! ¿Podrías decirme el orden correcto de las clases (si seguiste el curso y lo encontraste) para que resolvamos el problema?
El error que aparece es:
Traceback(most recent call last):File"functions.py", line 13,in<module>main()File"functions.py", line 9,in main
create_client('Barbara')File"functions.py", line 6,in create_client
clients += client
UnboundLocalError: local variable 'clients' referenced before assignment```
Por lo mostrado en el error, esta indicando que no existe una referencia local de clients, por lo que tendrías que adicionarle el keyword global para usar la referencia global. de la variable.
Tiene algunas configuraciones y plugins que agregue al mio.
Está muy bien para conocer el cliente y la configuración pero por ahora sigo con VScode jeje
No entendí, ¿qué error debe generarme?
Obtuve:
pablo, ricardodavid
Al final no arrojaba el error, ya que todavía teníamos debajo del punto de entrada los datos del nombre, por ello se ejecutaba. Creo que dio la instrucción un tanto antes de tiempo.
¿por qué no corre el código?
Pareciera que tuvieras un espacio de más entre __main__ y los dos puntos.
Hola! Prueba cambiando las comillas sencillas por comillas dobles, quedaría así:
if __name__ =="__main__":
Note que si en la funcion:
print_Client():
no se agrega la variable
global clients
igual funciona, alguien sabe porque?
A mí si no me funciona, a menos le agregue el global a la variable.
Te funciona porque la palabra reservada global debe usarse cuando se va a modificar el objeto dentro de la función. En tu caso, solo lo estás imprimiendo, por lo que el código corre sin problemas 😉
Alguien puede orientarme sobre de donde sale la lista y mas aun de donde sale el proyecto platzi ventas? siguen hablando del proyecto y no se de donde salió. Saludos
clients ='pablo,ricardo,'def create_client(client_name): global clients
clients += client_name
_add_comma()def list_clients(): global clients
print(clients)def _add_comma(): global clients
clients +=','if __name__ =='__main__':list_clients()create_client('david')list_clients()
¡Muy bien Francisco!
Buenas, porque se anade el _ al principio de ciertas funciones? y que significa estas instrucciones como por ejemplo name, cual es la definicion de estas?
Hola, en Python las funcionas/atributos que tienen _ como prefijo, se le conocen por estándar como funciones/atributos privados, es solo un estándar, dado que los tipos de datos privados o públicos no existen en Python.
Entonces, la idea es que esas funciones solo sean usadas dentro de otra función y no en el código del main por ejemplo.
Casi lo olvido, preguntas por name si?
Es algo especial de Python que se usa pea saber si el archivo es el main, e invocar las funciones adecuadas.
¿Cual es la diferencia entre usar el keyword global para clients y poner clients dentro de la funcion: list_clients(clients)? Se que funcionan diferente pero es una duda que me incomoda.
Excelente pregunta según lo que tengo entendido, global en este ejemplo se toma como una variable “explicita” por lo tanto no se haría del todo necesario poner clients dentro de una función aunque ponerla como.
list_clients(clients)
no es mala idea 😃
Con este código:
clients = 'pablo, ricardo, ’
def create_client(client_name):
clients += client_name
if name == ‘main’:
clients += ‘david’
print(clients)
Me regresa esto:
D:\EjerciciosPython>
pablo, ricardo, david
Si me funciona, ¿esta mal?
Tampoco me lanzó error al ejecutar el código
Probablemente sea por la versión de python que tienes
no entendí para que sirve ??
if name=‘main’:
create_client(‘David’)
print(clients)
if name == 'main': Con esto lo que haces es indicarle a Python que con el cuerpo de esta sentencia inicia la ejecución de tu script CUANDO LO EJECUTAS
Con create_client('david') lo que estás haciendo es agregar a david a la lista de clientes, y estamos ubicando un list_clients() antes y después para que veas qué tal se modifica la lista de clientes
Errata:
if __name__ == ‘__main__’:
Con esto lo que haces es indicarle a Python que con el cuerpo de esta sentencia inicia la ejecución de tu script CUANDO LO EJECUTAS
No me quedo claro el concepto de funciones lambda en este video, así que tuve que buscar por internet más información acerca de lo que es una función lambda en python y me encontré con un concepto diferente a lo que se ve en el video, en fin creo que hay que cambiarle el título y agregar otro material donde se explique que es una función lambda!
El único objetivo es rapidez en el desarrollo o claridad en el código.