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 😉