Artículo original escrito por Dionysia Lemonaki
Artículo original Python Function Examples – How to Declare and Invoke with Parameters
Traducido y adaptado por andres-torres

Python posee una variedad de funciones útiles que puedes emplear para hacer cualquier tipo de cosas, ejecutando cada una de ellas una tarea específica.

¿Acaso sabías que Python también te permite definir tus propias funciones?

En este artículo te mostraré cómo crear y llamar tus propias funciones en Python. También tendrás una perspectiva de cómo efectuar parámetros y argumentos en tus funciones.

¿Qué es una función?

Una función no es más que un bloque de código aislado que lleva a cabo una tarea específica.

Las funciones son muy útiles en programación debido a que eliminan los innecesarios y excesivos ¨copia y pega¨ de código a través de un programa.

Si una acción específica es requerida a menudo en tu código, es un buen indicador de la necesidad de escribir una función. Las funciones son para ser reutilizadas.

Las funciones también te ayudan a organizar tu código.

Si necesitas hacer un cambio en tu programa, solo tendrás que actualizar la declaración de la función concerniente. Esto evita que tengas que buscar diferentes piezas del mismo código, esparcido en diferentes campos de tu programa.

Esto cumple con el principio de desarrollo de software DRY (Don't Repeat Yourself), que significa; no te repitas.

El código dentro de una función  se ejecuta solo cuando la función es llamada.

Las funciones pueden aceptar argumentos y valores predeterminados, pudiendo o no devolver valores una vez que se haya ejecutado el código.

Definir una función en Python

La sintaxis general para crear una función en Python es muy parecida a lo siguiente:

def nombre_funcion(parametros):
    contenido

Veamos qué significa:

  • def es una palabra reservada que indica a Python que una nueva función está siendo definida.
  • Luego viene una función con un nombre válido de tu elección. Los nombres válidos empiezan con una letra o un guion bajo, pero pueden incluir números. Las palabras suelen ser minúsculas y separadas por guiones bajos. Es importante saber que los nombres de función no pueden ser palabras reservadas de Python.
  • Luego, tenemos los paréntesis, (). Al interior de ellos, puede haber cero, uno, o más parámetros opcionales,  separados por coma con sus valores predeterminados. Estos valores son pasados a la función.
  • A continuación los dos puntos, :, los cuales finalizan la definición de la función.
  • Consiguientemente, es necesaria una nueva línea, seguida por un nivel de identación(pudiendo usar cuatro espacios con tu keyboard, o bien un espacio con la tecla Tab). La identación es importante, permite a Python reconocer qué código pertenecerá a la función.
  • La siguiente parte de la función representa el "body", o si lo prefieres, su contenido o estructura. Esta parte contiene las acciones que ejecutará Python cuando la función sea llamada.

Finalmente, existe un predicamento opcional, llamado "return", este devuelve un valor específico, finalizando con esto la ejecución de la función.

Ten presente que si olvidas el paréntesis() o los dos puntos : cuando intentes definir una nueva función, Python automáticamente te responderá con un SyntaxError.

Definir y llamar una función básica en Python

Abajo hay un ejemplo de una función básica que no posee la declaración "return" y no toma ningún parámetro.

Simplemente imprime "hola mundo" cada vez que es llamado.

def hola_mundo_func():
    print("hola mundo")
  

Una vez has definido una función, el código no se ejecutará por sí solo.

Para ejecutar el código dentro de la función, tienes que hacer una invocación de la función, o una llamada a la función.

Puedes llamar a la función tantas veces como lo desees.

Para llamar a la función solo necesitas hacer lo siguiente:

nombre_funcion(argumentos)

A continuación, un desglose del código:

  • Escribe el nombre de la función.
  • El nombre de la función tiene que ser seguido de paréntesis. Si hay algunos argumentos requeridos, tienen que ser pasados en paréntesis. En caso de que la función no tome ningún argumento, siempre necesitarás usar paréntesis.

Para llamar a la función del ejemplo anterior, la cual no toma en cuenta ningún argumento, haz lo siguiente:

Definir y Llamar Funciones con Parámetros.

Basándonos en lo anterior, habrás notado que funciones demasiado simples no hacen mucho más que imprimir algún valor o información en la consola.

¿Qué pasa si quieres añadir datos a la función?

Hemos usado los términos parámetro y argumentos.

¿Cuál es su definición?

Los parámetros son el marcador de posición que transfiere la información a las funciones. Sirven cómo variables definidas localmente en la función.

def saludo(nombre):
   print("Hola " + nombre)

En el ejemplo de arriba, está el parámetro, nombre.

Podríamos haber usado  f-string formatting (formato f-string) en su lugar, funciona de la misma manera que en el ejemplo anterior:

def saludo(nombre):
   print(f"Hola + {nombre}")

Puede haber una lista de parámetros adentro del paréntesis, todos separados por comas.

def nombre_y_edad(nombre,edad):
    print(f"Soy {nombre} y tengo{edad} años!")

Aquí, los parámetros en la función son nombre y edad.

Cuando una función es llamada, también se transfieren los argumentos.

Los argumentos, igual que los parámetros, son información transferida a las funciones.

Específicamente, son los valores actuales que corresponden a los parámetros en la definición de la función.

Llamando a la función desde un ejemplo anterior, y evaluando un argumento, el resultado debería ser el parecido al siguiente:

def saludo(nombre):
    print(f"Hola {nombre}")
    
    
saludo("Timmy")
#Resultado
# Hola Timmy

La función puede ser llamada varias veces, pudiendo ser sus valores, diferentes en cada ocasión.

def saludo(nombre):
    print(f"Hola {nombre}")
    
saludo("Timmy")
saludo("Kristy")
saludo("Jackie")
saludo("Liv")

#Resultados:
#"Hola Timmy"
#"Hola Kristy"
#"Hola Jackie"
#"Hola Liv"

Los argumentos presentados anteriormente son llamados argumentos posicionales.

En programación los argumentos posicionales son muy requeridos.

El número de argumentos posicionales es importante.

Cuando llamas a funciones, necesitas pasar el número correcto de argumentos, si no, obtendrás un error.

Cuando se trata de argumentos posicionales, el número de argumentos a pasar en una función que queremos llamar, tiene que ser exactamente el mismo que el número de parámetros que hemos definido anteriormente en la función.

Por ejemplo, tenemos una función definida con dos parámetros:

def saludo(primer_nombre,apellido):
    print(f"Hola, {primer_nombre} {apellido}")

Si la función es llamada con un solo argumento, entonces seguro habrá un error:

def saludo(primer_nombre,apellido):
    print(f"Hola, {primer_nombre} {apellido}")
    

saludo("Timmy")

Resultando:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: saludo() missing 1 required positional argument: 'apellido'

Si la función es llamada con tres argumentos cuando solo se necesitan dos, otra vez, habrá un error:

def saludo(primer_nombre,apellido):
    print(f"Hola, {primer_nombre} {apellido}")
    

saludo("Timmy","Jones",34)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: saludo() takes 2 positional arguments but 3 were given

Por último, también habrá error si en la llamada no hay ningún argumento.

def saludo(primer_nombre,apellido):
    print(f"Hola, {primer_nombre} {apellido}")
    

saludo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: saludo() missing 2 required positional arguments: 'primer_nombre' and 'apellido'

En vez de estos errores, necesitamos dos argumentos, ya que estos han sido definidos previamente en la función.

def saludo(primer_nombre,apellido):
    print(f"Hola, {primer_nombre} {apellido}")
    

saludo("Timmy","Jones")
#Resultado:
# Hola,Timmy Jones

El orden de los argumentos posicionales es importante.

Además de incluir el número correcto de argumentos, es importante notar el orden en el cual se indican los argumentos.

Los argumentos necesitan ser escritos en el orden exacto, en el que se han declarado los parámetros en la definición de la función.

Funciona igual que al asignar una variable.

Es simple, el primer argumento es el valor del primer parámetro en la definición de la función. El segundo argumento es el valor del segundo parámetro en la definición de la función, y así sucesivamente.

def saludo(primer_nombre,apellido):
    print(f"Hola, {primer_nombre} {apellido}")
    

saludo("Timmy","Jones")
#Resultado
#Hola,Timmy Jones 
#Puedes verlo como:
#primer_nombre = "Timmy"
#apellido = "Jones"

Si el orden no es correcto, puede que el resultado no sea el esperado.

def fav_lenguaje(nombre,lenguaje):
    print(f"Hola, Soy {nombre} y mi lenguaje de programación favorito es {lenguaje}")

    
fav_lenguaje("Python","Dionysia")
#Resultado:
#Hola, Soy Python y mi lenguaje de programación favorito es Dionysia
#Esto es lo que la función ejecutó
#nombre="Python"
#lenguaje = "Dionysia"

Cómo usar argumentos de palabras claves en las funciones de Python.

Anteriormente hemos visto un tipo de argumento, los argumentos posicionales.

Con los argumentos posicionales, cada valor corresponde directamente con el número, orden y posición de cada parámetro en la definición de la función.  

Sin embargo, las funciones en Python pueden aceptar otro tipo de argumento conocido como argumentos de palabras clave.

En este caso, en vez de solo introducir valores en la llamada de la función, es posible especificar el nombre del parámetro y luego el valor que buscas asignarle, en la forma de key = value.

Cada "key" o clave, coincide con cada parámetro en la definición de la función.

Explícitamente llamando el nombre de los parámetros y los valores que toma, ayuda a evitar posibles confusiones.

def fav_lenguaje(nombre,lenguaje):
    print(f"Hola, soy {nombre} y mi lenguaje de programación favorito es {lenguaje}")

    
fav_lenguaje(nombre="Dionysia",lenguaje="Python")
#Resultado:
#Hola, Soy Dionysia y mi lenguaje de programación favorito es Python

Los argumentos de palabras claves, como hemos visto, pueden estar en un orden particular. Sin embargo, son más flexibles que los argumentos posicionales, en el sentido que el orden de los argumentos no importa.

Por tanto puedes hacer lo siguiente y no habrá errores:

def fav_lenguaje(nombre,lenguaje):
    print(f"Hola, soy {nombre} y mi lenguaje de programación favorito es {lenguaje}")

    
fav_lenguaje(lenguaje="Python",nombre="Dionysia")
#Resultado:
#Hola, Soy Dionysia y mi lenguaje de programación favorito es Python

No obstante todavía tienes que especificar el número correcto de argumentos.

Puedes usar tanto argumentos posicionales como de palabras clave, juntos al llamar una función. Como en el siguiente ejemplo, con un tipo de argumento respectivamente.

def fav_lenguaje(nombre,lenguaje):
    print(f"Hola, soy {nombre} y mi lenguaje de programación favorito es {lenguaje}")

    
fav_lenguaje("Dionysia","Python")
#Resultado:
#Hola, Soy Dionysia y mi lenguaje de programación favorito es Python

En este caso, el orden importa.

Los argumentos posicionales siempre van primero, antecediendo a los de palabras claves. De otra forma habrá un error.

def fav_lenguaje(nombre,lenguaje):
    print(f"Hola, soy {nombre} y mi lenguaje de programación favorito es {lenguaje}")

    
fav_lenguaje(lenguaje="Python","dionysia")

Definir un parámetro con un valor predeterminado en Python

Los argumentos de la función también pueden tener valores predeterminados. Estos también son conocidos como argumentos opcionales.

Para que una función tenga un valor predeterminado, tienes que asignarlo a un parámetro en la definición de la función.

Esto se efectúa mediante el uso de la estructura key=value, donde value será el valor predeterminado del parámetro.

def fav_lenguaje(lenguaje="Python"):
    print(f"Mi lenguaje favorito de programación es {lenguaje}!")
    
fav_lenguaje()
#resultado
#Mi lenguaje favorito de programación es python!

Cómo ves, los argumentos predeterminados no son requeridos en la llamada a la función, y el valor de  lenguaje siempre será establecido por Python si otro valor no es proveído.

Sin embargo, los valores predeterminados pueden ser fácilmente invalidados si no provees otro valor cuando llamas a la función:

def fav_lenguaje(lenguaje="python"):
    print(f"Mi lenguaje favorito de programación es {lenguaje}!")
      
fav_lenguaje("Java")
#Imprime "Mi lenguaje favorito de programación es Java!" en la consola

Pueden haber varios valores predeterminados en una función.

Cuando la función es llamada,pueden haber cero, uno o varios argumentos predeterminados, y en el singular caso de estos, el nombre no importa.

def detalles_personales(nombre="Jimmy",edad=28,ciudad="Berlin"):
    print(f"Soy {nombre}, tengo {edad} y vivo en {ciudad}") 
    
#Podemos hacer lo siguiente:

detalles_personales()
#Resultado:
#Soy Jimmy, tengo 28 y vivo en Berlin

detalles_personales(edad=30)
#Soy Jimmy, tengo 30 y vivo en Berlin

detalles_personales(ciudad='atenas',nombre='ben',edad='24')
#Soy ben, tengo 24 y vivo en atenas

Los argumentos predeterminados pueden ser combinados con argumentos no predeterminados en la llamada a la función.

He aquí un ejemplo de una función que acepta dos argumentos: uno posicional, no predeterminado "nombre" y el otro opcional predeterminado "lenguaje".

def fav_lenguaje(nombre,lenguaje="Python"):
    print(f"Mi nombre es {nombre} y mi lenguaje de programación favorito es {lenguaje}!")
    
fav_lenguaje("Dionysia")
#Resultado:
#"Mi nombre es Dionysia y mi lenguaje de promación favorito es Python!" 

El argumento predeterminado, lenguaje="Python", es opcional. Pero el argumento posicional nombre, siempre será requerido. Si otro lenguaje no es especificado, el valor será determinado por Python.

Otro aspecto a recordar; cuando argumentos predeterminados y no predeterminados son usados juntos, el orden en que son definidos en la función es importante.

Todos los argumentos posicionales preceden a los argumentos predeterminados.

Lo siguiente no funcionará:

def fav_lenguaje(lenguage="Python",nombre):
    print(f"Mi nombre es {nombre}y mi lenguaje de promación favorito es {lenguaje}!")
    
fav_lenguaje("Dionysia")

Efectivamente:

 File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

En conclusión

En este artículo, habrás aprendido cómo declarar funciones y llamarlas con parámetros, en el lenguaje de programación Python.

Esta fue una introducción referente a cómo crear funciones simples y cómo pasar datos en ellas mediante parámetros. También se presentaron los siguientes tipos de argumentos; posicionales, de palabras claves y predeterminados.

Para recapitular:

  • El orden y número de los argumentos posicionales es esencial.
  • En el caso de los argumentos de palabras clave, el orden no es fundamental, pero los valores sí, ya que cada palabra clave corresponde con un parámetro específico en la definición de la función.
  • Los argumentos predeterminados son enteramente opcionales. Puedes usar uno, varios o ninguno de ellos.

Si estás interesado en profundizar más tu aprendizaje de Python, freeCodeCamp tiene una certificación gratuita de Python.

Empezarás con los fundamentos básicos del lenguaje, hasta progresar a un nivel más avanzado, donde aprenderás conceptos como estructuras de datos y bases de datos relacionales. Al final, construirás cinco proyectos para poner en práctica lo que has aprendido.

Muchas Gracias por leer y feliz aprendizaje.