Menu

Funciones en Python: def, return, argumentos por defecto y por palabra clave

Cómo definir y usar funciones en Python — parámetros, valores de retorno, argumentos por defecto, argumentos por palabra clave y hábitos de nombrado que mantienen el código legible.

Una función es un bloque de pasos con nombre

Cada vez que te encuentres escribiendo las mismas pocas líneas más de una vez — o queriendo dar un nombre a un trozo pequeño de lógica — estás listo para escribir una función. Las funciones son la primera herramienta real para gestionar complejidad en un programa Python.

La forma básica:

main.py
Output
Click Run to see the output here.

Desglosándolo:

  • def es la palabra clave que inicia la definición de una función.
  • greet es el nombre de la función.
  • (name) es la lista de parámetros — las entradas que toma la función.
  • Los dos puntos terminan la cabecera; el bloque indentado debajo es el cuerpo.
  • greet("Ada") es una llamada. Python ejecuta el cuerpo con name atado a "Ada".

Las funciones quedan dormidas hasta que se llaman. Definir una no la ejecuta. Llamarla con greet("Ada") sí.

Parámetros y argumentos

La palabra parámetro es el nombre dentro de la definición de la función. La palabra argumento es el valor que se pasa al llamarla. No es gran cosa en conversación informal, pero la distinción ayuda al leer mensajes de error.

main.py
Output
Click Run to see the output here.

Aquí base y exponent son parámetros. 2 y 10 son argumentos. Python los ata en orden: primer argumento al primer parámetro, y así.

return: devolver un valor

print escribe en pantalla. return devuelve un valor a quien llama para que pueda usarlo:

main.py
Output
Click Run to see the output here.

Sin return, una función devuelve None por defecto:

main.py
Output
Click Run to see the output here.

return también sale de la función inmediatamente. Verás a menudo retornos tempranos usados para salir de casos borde antes de la lógica principal:

main.py
Output
Click Run to see the output here.

Los retornos tempranos evitan que el cuerpo principal quede profundamente anidado en if/else.

Argumentos por defecto

Un parámetro puede tener un valor por defecto, usado cuando quien llama no proporciona uno:

main.py
Output
Click Run to see the output here.

Todos los parámetros con defaults deben venir después de los parámetros sin defaults. def f(a, b=1, c): es un error de sintaxis.

La trampa del default mutable

Este es el gotcha más famoso de Python. Mira:

main.py
Output
Click Run to see the output here.

Esperarías que cada llamada empiece con una lista vacía. En su lugar, la lista por defecto se comparte entre llamadas, y los elementos se acumulan. Python evalúa el default una vez, cuando la función se define, y reutiliza esa única lista para siempre.

El patrón seguro es usar None como default y crear la lista dentro de la función:

main.py
Output
Click Run to see the output here.

Ahora cada llamada que no pase items obtiene una lista fresca. Esta regla aplica a listas, dicts, sets — cualquier cosa mutable.

Argumentos por palabra clave

Puedes pasar argumentos por nombre en vez de por posición. Eso te deja saltarte parámetros del medio y hacer llamadas largas más legibles:

main.py
Output
Click Run to see the output here.

Los argumentos posicionales y por palabra clave se pueden mezclar, pero los posicionales tienen que ir primero:

main.py
Output
Click Run to see the output here.

En cuanto una función tiene más de tres o cuatro parámetros, favorecer los argumentos por palabra clave hace las llamadas mucho más fáciles de leer.

Parámetros solo-posicionales y solo-por-palabra-clave

Python te deja marcar algunos parámetros como llamables solo por posición (con /) o solo por palabra clave (con *):

main.py
Output
Click Run to see the output here.

No necesitas esto el primer día. Se vuelven útiles cuando diseñas APIs y quieres fijar cómo las usan quienes llaman.

Docstrings y nombrado

La primera línea dentro de una función puede ser una docstring — un string con triple comilla que Python trata como documentación:

main.py
Output
Click Run to see the output here.

Herramientas como help(), los tooltips de IDE y los generadores de documentación leen la docstring automáticamente. Una línea es mucho mejor que nada.

Y por favor, piensa en el nombrado:

  • Los nombres de función deberían ser verbos: fetch_profile, compute_total, is_valid.
  • Usa lower_snake_case.
  • Las funciones que devuelven un booleano suelen empezar con is_, has_ o can_.

Un buen nombre hace que el sitio de la llamada se explique solo sin necesidad de comentario.

Las funciones puras son más fáciles de razonar

Una función pura devuelve la misma salida para la misma entrada y no tiene efectos secundarios — no modifica estado global, no imprime a stdout (salvo para depurar) ni escribe en archivos.

main.py
Output
Click Run to see the output here.

Ambas tienen su sitio, pero en código que quieras reutilizar y testear, empuja hacia funciones puras tanto como puedas.

Un pequeño ejemplo práctico

Una función rápida que combina defaults, argumentos por palabra clave y return:

main.py
Output
Click Run to see the output here.

Siguiente: listas flexibles de argumentos

A veces no sabes con cuántos argumentos se llamará una función — o quieres reenviar los argumentos que lleguen a otra función. *args y **kwargs manejan eso. Esa es la siguiente página.

Preguntas frecuentes

¿Cómo defino una función en Python?

Usa la palabra clave def, seguida del nombre de la función, paréntesis para los parámetros y dos puntos. El bloque indentado debajo es el cuerpo de la función. Ejemplo: def greet(name): print(f'Hi, {name}').

¿Qué hace return en Python?

return envía un valor de vuelta a quien llamó a la función. Una función sin return explícito devuelve None automáticamente. Una vez que return se ejecuta, la función sale inmediatamente — cualquier código después en el mismo bloque se salta.

¿Qué son los argumentos por defecto en Python?

Los argumentos por defecto dejan que un parámetro tenga un valor preestablecido que se usa si quien llama no proporciona uno. def greet(name='friend'): significa que greet() sin argumentos usa 'friend'. Nunca uses defaults mutables como [] — ver abajo el patrón seguro.

Aprende a programar con Coddy

COMENZAR