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:
Desglosándolo:
defes la palabra clave que inicia la definición de una función.greetes 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 connameatado 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.
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:
Sin return, una función devuelve None por defecto:
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:
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:
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:
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:
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:
Los argumentos posicionales y por palabra clave se pueden mezclar, pero los posicionales tienen que ir primero:
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 *):
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:
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_ocan_.
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.
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:
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.