Debido a que una definición de función puede tener múltiples parámetros, una llamada de función puede necesitar varios argumentos. Puedes pasar argumentos a tus funciones de muchas maneras.

  • Puede usar argumentos posicionales, que deben estar en el mismo orden en que se escribieron los parámetros.
  • argumentos de palabra clave (keyword arguments), donde cada argumento consta de un nombre de variable y un valor; y listas y diccionarios de valores. Veamos cada uno de estos.

1. Argumentos posicionales

Cuando llamas a una función, Python debe hacer coincidir cada argumento en la función, con un parámetro en la definición de la función. La forma más sencilla de hacer esto se basa en el orden de los argumentos proporcionados. Valores coincidentes de esta manera se llaman argumentos posicionales (positional arguments).

Para ver cómo funciona esto, considere una función que muestra información sobre mascotas. La función nos dice qué tipo de animal es cada mascota y el nombre de la mascota, como se muestra aquí:

src/pets.py

def describe_pet(animal_type, pet_name):
    """Display information about a pet."""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")

describe_pet('hamster', 'harry')

La definición muestra que esta función necesita un tipo de animal y el nombre del animal. Cuando llamamos a describe_pet(), necesitamos proporcionar un tipo de animal y un nombre, en ese orden. Por ejemplo, en la llamada de función, el argumento ‘hamster’ se almacena en el parámetro animal_type y el argumento ment ‘harry’ se almacena en el parámetro pet_name. En el cuerpo de la función, estos dos parámetros se utilizan para mostrar información sobre la mascota que se está describiendo.

El resultado describe a un hámster llamado Harry:

I have a hamster.
My hamster's name is Harry.

2. Llamadas múltiples a una función

Puede llamar a una función tantas veces como sea necesario. Describiendo una segunda mascota diferente requiere solo una llamada más para describe_pet():

def describe_pet(animal_type, pet_name):
	"""Display information about a pet."""
	print("\nI have a " + animal_type + ".")
	print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('hamster', 'harry')
describe_pet('dog', 'willie')

3. Importancia del orden en los argumentos posicionales

Puedes obtener resultados inesperados si confundes el orden de los argumentos en una llamada de función cuando se usan argumentos posicionales:

def describe_pet(animal_type, pet_name):
    """Display information about a pet."""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")

describe_pet('harry', 'hamster')

En esta llamada de función enumeramos primero el nombre y segundo el tipo de animal. Debido a que el argumento ‘harry’ aparece primero esta vez, ese valor se almacena en el parámetro animal_type . Asimismo, ‘hamster’ se almacena en pet_name . Ahora nosotros tener un “harry” llamado “Hamster”:

I have a harry.
My harry's name is Hamster.

Sólo es un resultado incoherente y divertido, ¿y si confundiesemos números y cadenas?

>>> def test_func(str,num):
...     if num >= 5:
...             print(num)
... 
>>> test_func(12,'cadena')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test_func
TypeError: '>=' not supported between instances of 'str' and 'int'

4. Argumentos de palabras clave

Un argumento de palabra clave (keyword argument) es un par de nombre y valor que pasa a una función. Asocias directamente el nombre y el valor dentro del argumento, por lo que cuando pasa el argumento a la función, no hay confusión (no terminarás con un Harry llamado Hamster). Los argumentos de palabras clave lo liberan de tener preocuparse por ordenar correctamente sus argumentos en la llamada de función, y aclaran el papel de cada valor en la llamada de función.

Vamos a reescribir la función describe_pet así:

src/pets_keyword.py

def describe_pet(animal_type, pet_name):
    """Display information about a pet."""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")

describe_pet(animal_type='hamster', pet_name='harry')
describe_pet( pet_name='harry', animal_type='hamster') # mismo resultado

La función describe_pet() no ha cambiado. Pero cuando llamamos a la función, le decimos explícitamente a Python qué parámetro debe ser combinado con cada argumento. Cuando Python lee la llamada a la función, sabe almacenar la argumento ‘hamster’ en el parámetro animal_type y el argumento ‘harry’ en nombre_mascota. La salida muestra correctamente que tenemos un hámster llamado Harry.

El orden de los argumentos de palabras clave no importa porque Python sabe dónde debe ir cada valor. Las siguientes dos llamadas de función son equivalentes:

describe_pet(animal_type='hamster', pet_name='harry')
describe_pet( pet_name='harry', animal_type='hamster') 

5. Valores por defecto

Al escribir una función, puede definir un valor predeterminado para cada parámetro. Si se proporciona un argumento para un parámetro en la llamada de función, Python usa el valor del argumento. Si no, utiliza el valor predeterminado del parámetro. Así que cuando define un valor predeterminado para un parámetro, puede excluir el correspondiente argumento que normalmente escribiría en la llamada a la función. Uso de valores predeterminados puede simplificar sus llamadas a funciones y aclarar las formas en que sus funciones se utilizan normalmente.

Por ejemplo, si observa que la mayoría de las llamadas a describe_pet() se utilizan para describir perros, puede establecer el valor predeterminado de animal_type en ‘perro’ . Ahora cualquiera que llame a describe_pet() para un perro puede omitir esa información:

src/pets_default_args.py

def describe_pet(pet_name, animal_type='dog'):
    """Display information about a pet."""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(pet_name='willie')

Cambiamos la definición de describe_pet() para incluir un valor predeterminado, ‘perro’, para tipo_animal. Ahora, cuando se llama a la función sin animal_type especificado, Python sabe usar el valor ‘perro’ para este parámetro:

I have a dog.
My dog's name is Willie.

La forma más sencilla de usar esta función ahora es proporcionar solo el nombre en la llamada de función:

describe_pet('willie')

Esta llamada de función tendría el mismo resultado que el ejemplo anterior. El único argumento proporcionado es ‘willie’, por lo que se empareja con el primer parámetro en la definición, pet_name . Porque no se proporciona ningún argumento para animal_type, Python usa el valor predeterminado ‘dog’.

6. Llamadas equivalentes a funciones

Debido a que los argumentos posicionales, los argumentos de palabras clave y los valores predeterminados se pueden usar juntos, a menudo tendrá varias formas equivalentes de llamar a una función. Considere la siguiente definición para describe_pets() con un valor predeterminado proporcionado:

def describe_pet(pet_name, animal_type='dog'):

Con esta definición, siempre se debe proporcionar un argumento para pet_name, y este valor se puede proporcionar usando el formato de palabra clave o posicional.

Todas las siguientes llamadas funcionarían para esta función:

# A dog named Willie.
describe_pet('willie')
describe_pet(pet_name='willie')

# A hamster named Harry.
describe_pet('harry', 'hamster')
describe_pet(pet_name='harry', animal_type='hamster')
describe_pet(animal_type='hamster', pet_name='harry')

7. Evitar errores de argumento

Cuando comience a usar funciones, no se sorprenda si encuentra errores sobre argumentos. Los argumentos no coincidentes ocurren cuando usted proporciona menos o más argumentos de los que una función necesita para hacer su trabajo. Por ejemplo, esto es lo que sucede si tratamos de llamar a describe_pet() sin argumentos:

describe_pet()
TypeError: describe_pet() missing 1 required positional argument: 'pet_name'

8. Ahora prueba tu

8.1. t_shirt.py

Escribe una función llamada make_shirt() que acepte una talla y el texto de un mensaje que debe ser impreso en la camiseta. La función debe imprimir una frase que resuma la talla de la camiseta y el mensaje impreso en ella. Llame a la función una vez usando argumentos posicionales para hacer una camisa. Llama a función por segunda vez usando argumentos de palabras clave.

8.2. large_shirts.py

Modificar la función make_shirt() para que las camisetas sean grandes (X) por defecto con un mensaje que dice Me encanta Python. Haz una camisa grande y un camisa mediana con el mensaje por defecto, y una camisa de cualquier tamaño con un diferente mensaje.

8.3. cities.py

Escribe una función llamada describe_city() que acepte el nombre de una ciudad y su país. La función debe imprimir una oración simple, como Reikiavik está en Islandia. Asigne al parámetro para el país un valor predeterminado. Llame a su función para tres ciudades diferentes, al menos una de las cuales no está en el país predeterminado.