Funciones + alcance
Lógica reutilizable y código limpio
Por qué importa
Las funciones mantienen tu lógica reutilizable, comprobable y legible.
La idea
Una función es un miniprograma: entrada → procesamiento → salida. Los argumentos por defecto convierten una función en muchas; *args / **kwargs la vuelven variádica. El alcance sigue la regla LEGB: Local → Envolvente (Enclosing) → Global → Integrado (Built-in).
Pruébalo
Argumentos por defecto + argumentos por palabra clave:
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
print(greet("Ada"))
print(greet("Linus", greeting="Hi"))
print(greet(greeting="Howdy", name="Margaret"))
*args / **kwargs capturan los argumentos posicionales y por palabra clave sobrantes:
def describe(*things, **labels):
for t in things:
print("-", t)
for k, v in labels.items():
print(k, "=", v)
describe("apple", "banana", "cherry", colour="red", taste="sweet")
Alcance: una función ve los nombres externos pero no puede re-vincularlos sin nonlocal / global:
counter = 0
def inc():
global counter
counter += 1
inc(); inc(); inc()
print("counter:", counter)
def outer():
x = 1
def inner():
nonlocal x
x += 10
inner()
print("outer.x:", x)
outer()
Patrones de funciones según el tipo de dato
La forma de una función suele seguir el tipo sobre el que trabaja. Estos tres patrones conectan directamente con las lecciones de estructuras de datos:
- list → devuelve una lista nueva:
[x*2 for x in nums] - dict → constrúyelo con
.get():counts[x] = counts.get(x, 0) + 1 - str → normaliza y luego compara:
s.lower()
Verificación rápida
- P: ¿Cuál es la diferencia entre
printyreturn? R:returndevuelve un valor;printsolo lo muestra.
Mini ejercicios
- Escribe
is_even(n). - Escribe
square_all(nums)usando un bucle.
Buenas y malas prácticas
- Mantén las funciones pequeñas y enfocadas.
- No uses argumentos por defecto mutables como
def f(x=[]).
Errores comunes
- Error: Olvidar devolver un valor. Solución: Agrega
return. - Error: Mutar una lista usada como argumento por defecto. Solución: Usa
Noney crea la lista dentro.
Conclusiones clave
- Los argumentos por defecto se evalúan UNA SOLA VEZ en la definición: no uses mutables como valores por defecto.
*args/**kwargspermiten reenviar argumentos (f(*args, **kwargs)).- Alcance LEGB: Local → Envolvente → Global → Integrado.
- Las funciones puras (sin efectos secundarios) son más fáciles de probar y razonar.