Kodokon kodokon.com

Funciones: def, parámetros, return y ámbito

Estructura tu código en funciones reutilizables, domina los valores por defecto y comprende el ámbito de las variables.

10 min · 3 preguntas

Abrir esta lección en Kodokon

Ya sabes escribir bucles y condiciones; ahora es momento de estructurar tu código. Una función aísla una tarea concreta detrás de un nombre claro: la escribes una vez, la pruebas una vez, la llamas en todas partes. def declara la función, los parámetros reciben los valores de entrada y return devuelve el resultado a quien la llamó. Recuerda algo que a menudo se pasa por alto: una función sin return devuelve None.

PYTHON
def net_price(price, tax_rate):
    total = price * (1 + tax_rate)
    return round(total, 2)

result = net_price(100, 0.2)
print(result)  # 120.0
La función recibe dos parámetros y devuelve un valor con return.

Los valores por defecto hacen que una función sea flexible sin multiplicar variantes: decláralos después de los parámetros obligatorios. Al llamarla, los argumentos con nombre (currency="USD") documentan tu intención. En código profesional, se usan en cuanto una función tiene más de dos parámetros: la llamada se lee con claridad sin necesidad de abrir la definición.

PYTHON
def format_price(amount, currency="EUR", digits=2):
    return f"{amount:.{digits}f} {currency}"

print(format_price(19.9))                  # 19.90 EUR
print(format_price(19.9, currency="USD"))  # 19.90 USD
print(format_price(19.9, digits=0))        # 20 EUR
Los argumentos con nombre permiten indicar solo lo que cambia.
PYTHON
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

print(add_item("pen"))   # ['pen']
print(add_item("book"))  # ['book']
Con el patrón None, cada llamada parte de una lista nueva.

El ámbito determina dónde existe una variable. Una variable creada dentro de una función es local: desaparece cuando termina la llamada. Una función puede leer una variable global, pero cualquier asignación crea una nueva variable local - la global queda intacta. Buen hábito: en lugar de modificar variables globales, pasa parámetros y devuelve resultados; tu código se vuelve predecible y testeable.

PYTHON
rate = 0.2

def apply_tax(price):
    return round(price * (1 + rate), 2)

def set_rate(new_rate):
    rate = new_rate  # local variable, no effect

print(apply_tax(100))  # 120.0
set_rate(0.1)
print(apply_tax(100))  # 120.0, the global is untouched
Leer una variable global funciona; asignarla crea una local.

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Qué devuelve una función de Python que no tiene ninguna instrucción return?
    • 0
    • None
    • Una cadena vacía
    • Se lanza un error
  2. ¿Por qué hay que evitar def add_item(item, items=[])?
    • La lista por defecto se crea una sola vez y se comparte entre las llamadas
    • Una lista no se puede usar como valor por defecto
    • Lanza un SyntaxError al definir la función
  3. ¿Qué ocurre cuando asignas una variable dentro de una función mientras existe una global con el mismo nombre?
    • Python modifica la variable global
    • Python crea una variable local, la global queda intacta
    • Python lanza un error de conflicto de nombres