Tipos de parámetros en una función Python

Tipos de parámetros en una función Python

En este tutorial quiero enseñarte algo que considero esencial para que controles el lenguaje Python: Los tipos de parámetros de una función. Si has estado jugando con el lenguaje, sabrás que a la hora de definir una función puedes indicar una serie de parámetros.

En el siguiente ejemplo, la función es_mayor devuelve si el parámetro x es mayor que el parámetro y:

def es_mayor(x, y):
    return x > y

Al invocar a la función, lo haremos del siguiente modo:

>>>es_mayor(5, 3)
True

Sin embargo, si al llamar a la función no pasamos todos los argumentos, el intérprete lanzará una excepción:

>>>es_mayor(5)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: es_mayor() missing 1 required positional argument: 'y'

Lo que nos está indicando es que el argumento posicional ‘y’ es obligatorio y no se ha especificado.

Antes de seguir es importante que tengas en cuenta que, por defecto, los valores de los argumentos se asignan a los parámetros en el mismo orden en el que los pasas al llamar a la función. Más adelante veremos que esta circunstancia puede cambiar.

Parámetros opcionales en una función Python

Además de como hemos visto hasta ahora, en una función Python se pueden indicar una serie de parámetros opcionales. Son parámetros que se indican con un valor por defecto y si no se pasan al invocar a la función entonces toman este valor.

Imaginemos el constructor (método __init__) de una clase Punto que toma los valores de las coordenadas en las que se creará un objeto de dicha clase:

class Punto:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return "x: {}, y: {}".format(self.x, self.y)

Como vemos, en el método __init__ se indican dos parámetros: la coordenada x y la coordenada y de un punto:

>>>Punto(1, 2)
x: 1, y: 2

Según te indiqué en el apartado anterior, si llamamos a la función sin pasar ningún argumento nuestro código fallará:

>>>Punto()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: __init__() missing 2 required positional arguments: 'x' and 'y'

Podemos mejorar nuestra función __init__ de manera que si no se indica alguno de los parámetros, entonces tome el valor por defecto 0. Para indicar un parámetro de forma opcional se usa el operador ‘=‘. Veamos cómo quedaría:

def __init__(self, x=0, y=0):
    self.x = x
    self.y = y

Ahora podemos invocar a la función del siguiente modo:

>>>Punto()
x: 0, y: 0

>>>Punto(3)
x: 3, y: 0

Consideremos a continuación la siguiente función saludo:

def saludo(nombre, mensaje="encantado de saludarte"):
    print("Hola {}, {}".format(nombre, mensaje))

El parámetro nombre no indica un valor por defecto, por tanto, es obligatorio. No ocurre lo mismo con el parámetro mensaje, cuyo valor por defecto es «encantado de saludarte». En caso de no pasar este argumento, se tomará dicho valor por defecto. Por el contrario, si se indica, se sobreescribirá con el nuevo valor.

En una función se pueden especificar tantos parámetros opcionales como se quiera. Sin embargo, una vez que se indica uno, todos los parámetros a su derecha también deben ser opcionales. Esto quiere decir que los parámetros obligatorios no pueden seguir a los parámetros por defecto.

El siguiente ejemplo define una función de forma incorrecta:

def saludo(mensaje="encantado de saludarte", nombre)

Al tratar de hacer uso de la función, el intérprete de Python nos indicará el error:

def saludo(mensaje="encantado de saludarte", nombre):
              ^
SyntaxError: non-default argument follows default argument

Parámetros posicionales y parámetros con nombre en una función

Tal y como te indiqué anteriormente, cuando invocamos a una función en Python con diferentes argumentos, los valores se asignan a los parámetros en el mismo orden en que se indican.

Siguiendo con el ejemplo anterior de la función saludo, imaginemos que llamamos a la función de la siguiente manera  saludo("j2logo", "¿cómo estás?"). De este modo, al parámetro nombre se le asignará el valor «j2logo» y al parámetro «mensaje» el valor «¿cómo estás?»

Esto es así porque el valor en el que se asignan los argumentos depende del orden con el que se llaman. Sin embargo, el orden se puede cambiar si llamamos a la función indicando el nombre de los parámetros. Para que lo veas más claro, los siguientes ejemplos son todos válidos:

>>>saludo(mensaje="¿cómo estás?", nombre="j2logo")
Hola j2logo, ¿cómo estás?

>>>saludo(nombre="j2logo", mensaje="¿cómo estás?")
Hola j2logo, ¿cómo estás?

>>>saludo("j2logo", mensaje="¿cómo estás?")
Hola j2logo, ¿cómo estás?

Como vemos, podemos mezclar el orden de los parámetros si indicamos su nombre. Eso sí, siempre deben estar a la derecha de los parámetros posicionales, es decir, aquellos que se indican sin nombre y cuyo valor se asigna en el orden en el que se indica.

Parámetros de número variable: *args y **kwargs en Python.

Hasta aquí te he enseñado lo fundamental sobre los distintos tipos de parámetros al definir una función Python. No obstante, si quieres ser un auténtico pythonista 🐍 y completar tu formación, debes leer el siguiente tutorial para entender ☞ qué significan los parámetros *args y **kwargs en una función. Siguiendo este tutorial, habrás completado tu formación sobre los tipos de parámetros en una función Python.

Conclusión

A continuación te indico los puntos clave que se pueden extraer de este tutorial:

  • Por defecto, al llamar a una función los valores de los argumentos se asignan en el mismo orden en el que se pasan al invocar a dicha función.
  • Los parámetros opcionales se indican con el operador ‘=’, tienen un valor por defecto y siempre  se definen después de los parámetros obligatorios.
  • Se puede modificar el orden de los argumentos con el que se invoca a una función si se indica el nombre de los parámetros. Los parámetros con nombre siempre aparecen después de los posicionales.

Espero que te haya servido de ayuda 😉

La imagen de la cabecera es obra de brgfx

¿Quieres ser expert@ en Python? Recibe trucos Python y las últimas novedades del blog

¡Eyyy! Esto también te puede interesar 👇

* Te informo de que los datos de carácter personal que proporciones al comentar serán tratados por Juan José Lozano Gómez como responsable de esta web. La Finalidad es moderar los comentarios. La Legitimación es gracias a tu consentimiento. Destinatarios: tus datos se encuentran alojados en Disqus (disqus.com), mi sistema de comentarios, que está acogido al acuerdo de seguridad EU-US Privacy. Podrás ejercer Tus Derechos de Acceso, Rectificación, Limitación o Suprimir tus datos enviando un email a juanjo@j2logo.com. Encontrarás más información en la POLÍTICA DE PRIVACIDAD.

Sobre j2logo

j2logo profile

Quiero ayudarte a que seas mejor programador/a, pero no uno cualquiera, sino uno de los top.

¿Quieres ser expert@ en Python? 🐍

❤️ He ayudado a miles de programadores/as como tú a ser mejores Pythonistas

📩 Recibe de vez en cuando trucos y scripts Python y las últimas novedades del blog

* Al enviar el formulario confirmas que aceptas la POLITICA DE PRIVACIDAD

¿Quieres ser expert@ en PYTHON?

j2logo-pythonistas

❤️ He ayudado a miles de programadores/as como tú

📩 Recibe trucos, scripts y las novedades del blog

¿Quieres dominar Python?

Python, Guía para ser un Pythonista

El curso con el que aprender el lenguaje desde cero. Con mi soporte y ayuda.

OFERTA BLACK FRIDAY

35% de descuento