En este segundo método incluimos en la definición de la función los valores que tomarán los parámetros en el caso de que la invocación a la función no incluya todos los argumentos necesarios. Por ejemplo, en la siguiente función definimos dos parámetros, a y b, y damos al segundo el valor por defecto de 0:
def suma(a, b = 0):
return a + b
suma(3, 5)
8
Tal y como vemos, podemos seguir invocando la función con tantos argumentos como parámetros, y éstos siguen siendo asignados según su posición. Pero ahora podríamos no incluir argumentos para los parámetros que incluyen un valor por defecto. Por ejemplo:
def suma(a, b = 0):
return a + b
suma(3)
3
Comprobamos que la función sigue considerando los parámetros a y b, pero éste último, al no haber recibido un valor en la invocación, adopta su valor por defecto, cosa que podemos comprobar con el siguiente código:
def suma(a, b = 0):
print("a:", a)
print("b:", b)
suma(3)
a: 3
b: 0
El único requisito para utilizar este tipo de argumentos es que, en la definición de la función, no haya parámetros sin valor por defecto a la derecha de algún parámetro con valor por defecto. Por ejemplo, el siguiente código devolvería un error:
def suma(a = 0, b):
return a + b
File "<ipython-input-8-3248cdc0e62e>", line 1
def suma(a = 0, b):
^
SyntaxError: non-default argument follows default argument
El motivo es claro: si invocamos la función con un único argumento ¿a qué parámetro se asignaría? ¿al parámetro "a" por ser el primero? ¿o al parámetro "b" ya que "a" tiene ya un valor por defecto?