Argumentos Posicionales y Argumentos con Nombre

Al programar en Python, puedes utilizar argumentos posicionales, argumentos con nombre o una combinación de ambos al definir y llamar a funciones. El uso adecuado de estos argumentos puede mejorar la legibilidad y flexibilidad de tu código.

Argumentos Posicionales

Los argumentos posicionales son aquellos que deben pasarse a una función en el orden correcto. Aquí hay un ejemplo donde construimos una función sencilla para generar un nombre completo:
def full_name(first_name, last_name):
    return f'{first_name} {last_name}'  # Combina el nombre y el apellido

print(full_name('Anna', 'Brown'))       # Imprime 'Anna Brown'
En el ejemplo anterior, Anna es el primer argumento y Brown es el segundo argumento. Si invertimos el orden de los argumentos, obtendremos resultados diferentes:
print(full_name('Brown', 'Anna'))       # Imprime 'Brown Anna'

Argumentos con Nombre

Por el contrario, los argumentos con nombre nos permiten especificar el nombre del argumento cuando lo pasamos a la función, mejorando así la legibilidad de nuestro código. Además, podemos usarlos para establecer valores predeterminados para argumentos opcionales.
def full_name(first_name, last_name):
    return f'{first_name} {last_name}'

print(full_name(last_name='Brown', first_name='Anna'))  # Imprime 'Anna Brown'
print(full_name(first_name='Anna', last_name='Brown'))  # Imprime 'Anna Brown'
Esto produce la misma salida que el primer ejemplo, sin importar el orden de los argumentos.
 
💡
Es importante notar que, al llamar a una función, los argumentos con nombre siempre deben seguir a los argumentos posicionales.
Si utilizas argumentos con nombre antes de argumentos posicionales en una llamada a función, Python generará un error de sintaxis. Esta regla ayuda a Python a diferenciar entre ambos tipos de argumentos. Si los argumentos posicionales siguen a los argumentos con nombre, el intérprete de Python se confunde porque espera que todos los argumentos posicionales ya hayan sido definidos. Aquí tienes un ejemplo de una llamada de función incorrecta que generaría un SyntaxError:
def greet(first_name, last_name):
    print('Hello', first_name, last_name)

greet(last_name='Doe', 'John')
# SyntaxError: positional argument follows keyword argument
Esta regla garantiza que las llamadas a funciones sean claras y sin ambigüedades, haciendo que el código sea más fácil de entender y menos propenso a errores.

Combinando Argumentos Posicionales y con Nombre

Considera esta función que formatea un nombre completo, incluyendo un segundo nombre:
# Valores predeterminados para middle y last (cadenas vacías)
def full_name(first, middle='', last=''):
    return first + ' ' + middle + ' ' + last

print(full_name('Anna', last='Brown'))                   # 'Anna  Brown'
print(full_name('Anna', middle='Louise', last='Brown'))  # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', last='Brown'))         # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', 'Brown'))              # 'Anna Louise Brown'
print(full_name(first='Anna', 'Louise', last='Brown'))   # SyntaxError
En este ejemplo, el primer nombre se proporciona como un argumento posicional, mientras que el apellido es un argumento con nombre. El segundo nombre no se proporciona, por lo que utiliza su valor predeterminado (una cadena vacía).
Otra regla importante es que, una vez que hayas comenzado a utilizar argumentos con nombre, todos los argumentos siguientes deben ser también argumentos con nombre. Por ejemplo, print(full_name(first='Anna', 'Louise', last='Brown')) generaría un error porque un argumento posicional (Louise) sigue a un argumento con nombre (first='Anna').
Finalmente, consideremos un ejemplo más complejo y práctico: una función que calcula el costo total de una compra con parámetros opcionales para impuestos y descuento.
# Los valores predeterminados para tax y discount se establecen en 0
def calculate_total_cost(price, tax=0.0, discount=0.0):
    return price + price * tax - discount

print(calculate_total_cost(100, tax=0.05))                # 105.0
print(calculate_total_cost(100, discount=10))             # 90.0
print(calculate_total_cost(100, tax=0.05, discount=10))   # 95.0
En este caso, el precio es un argumento posicional obligatorio, mientras que tax y discount son argumentos con nombre opcionales. Si no se proporcionan, asumirán sus valores predeterminados de 0.
 
To check your solution you need to sign in
Sign in to continue