Las funciones son la vida. Derecho? Si recién comenzó a aprender Python, no importa si este es su primer lenguaje de programación, o si llegó a Python desde otro idioma, entonces ya sabe que el número de parámetros en la declaración de función corresponde al número de argumentos que la función pasa cuando se llama.

Estos son los conceptos básicos. Esto es lo que ayuda a las personas a comprender el mundo que les rodea. Pero la afirmación "el número de parámetros es igual al número de argumentos" pone una bomba de tiempo en la cabeza del principiante, que se dispara después de que ve las misteriosas construcciones
*args
o
**kwargs
en la declaración de la función.
No dejes que ninguna insignia te lleve a un estupor. No hay nada arcaico aquí. En general, si estos diseños no le son familiares, le sugiero que trate con ellos.
Argumentos posicionales y nombrados
Para tratar con
*args
y
**kwargs
, necesitamos dominar los conceptos de argumentos posicionales y con nombre.
Primero, hablemos de cómo difieren. En la función más simple, simplemente mapeamos las posiciones de los argumentos y parámetros. El argumento No. 1 corresponde al parámetro No. 1, el argumento No. 2 al parámetro No. 2, y así sucesivamente.
def printThese(a,b,c): print(a, "is stored in a") print(b, "is stored in b") print(c, "is stored in c") printThese(1,2,3) """ 1 is stored in a 2 is stored in b 3 is stored in c """
Para llamar a una función, se requieren los tres argumentos. Si omite al menos uno de ellos, se mostrará un mensaje de error.
def printThese(a,b,c): print(a, "is stored in a") print(b, "is stored in b") print(c, "is stored in c") printThese(1,2) """ TypeError: printThese() missing 1 required positional argument: 'c' """
Si asigna un valor predeterminado al parámetro cuando declara una función, ya no es necesario indicar el argumento correspondiente al llamar a la función. El parámetro se vuelve opcional.
def printThese(a,b,c=None): print(a, "is stored in a") print(b, "is stored in b") print(c, "is stored in c") printThese(1,2) """ 1 is stored in a 2 is stored in b None is stored in c """
Los parámetros opcionales también se pueden establecer cuando se llama a una función usando sus nombres.
En el siguiente ejemplo, establecemos los tres parámetros en el valor predeterminado de
None
y observamos cómo se pueden asignar usando sus nombres y sin prestar atención al orden de los argumentos utilizados al llamar a la función.
def printThese(a=None,b=None,c=None): print(a, "is stored in a") print(b, "is stored in b") print(c, "is stored in c") printThese(c=3, a=1) """ 1 is stored in a None is stored in b 3 is stored in c """
Operador de asterisco
El operador
*
se asocia con mayor frecuencia con la operación de multiplicación en personas, pero en Python tiene otro significado.
Este operador le permite "desempaquetar" objetos dentro de los cuales se almacenan ciertos elementos. Aquí hay un ejemplo:
a = [1,2,3] b = [*a,4,5,6] print(b)
Aquí, el contenido de la lista
a
toma, desempaqueta y coloca en la lista
b
.
Cómo usar * args y ** kwargs
Entonces, sabemos que el operador "asterisco" en Python es capaz de "extraer" sus elementos constitutivos de los objetos. También sabemos que hay dos tipos de funciones de parámetros. Es posible que ya lo haya pensado usted mismo, pero por las dudas, lo diré. A saber,
*args
es una abreviatura de "argumentos" (argumentos), y ** kwargs es una abreviatura de "argumentos de palabras clave" (argumentos con nombre).
Cada una de estas construcciones se utiliza para desempaquetar argumentos del tipo correspondiente, lo que le permite llamar a funciones con una lista de argumentos de longitud variable. Por ejemplo, cree una función que pueda mostrar los resultados escritos por un alumno en una prueba:
def printScores(student, *scores): print(f"Student Name: {student}") for score in scores: print(score) printScores("Jonathan",100, 95, 88, 92, 99) """ Student Name: Jonathan 100 95 88 92 99 """
No
*args
construcción
*args
al declarar una función. En cambio, tengo
*scores
. ¿Hay algún error aquí? No hay error aquí. El hecho es que "args" es solo un conjunto de caracteres que se utilizan para denotar argumentos. Lo más importante aquí es el operador
*
. Y lo que viene después exactamente no juega un papel especial. Usando
*
creamos una lista de argumentos posicionales basados en lo que se pasó a la función cuando se llamó.
Después de descubrir
*args
, no debería haber más problemas para entender
**kwargs
. El nombre, nuevamente, no importa. Lo principal son dos personajes
**
. Gracias a ellos, se crea un diccionario que contiene argumentos con nombre pasados a la función cuando se llama.
def printPetNames(owner, **pets): print(f"Owner Name: {owner}") for pet,name in pets.items(): print(f"{pet}: {name}") printPetNames("Jonathan", dog="Brock", fish=["Larry", "Curly", "Moe"], turtle="Shelldon") """ Owner Name: Jonathan dog: Brock fish: ['Larry', 'Curly', 'Moe'] turtle: Shelldon """
Resumen
Aquí hay algunos consejos para ayudarlo a evitar problemas comunes que surgen al trabajar con funciones y ampliar su conocimiento:
- Utilice las construcciones comunes
*args
y **kwargs
para capturar argumentos posicionales y con nombre. **kwarg
s no se puede colocar antes de *args
. Si hace esto, se mostrará un mensaje de error.- Tenga cuidado con los conflictos entre los parámetros con nombre y
**kwargs
, en los casos en que se planea pasar el valor como argumento **kwarg
, pero el nombre clave de este valor coincide con el nombre del parámetro con nombre. - El operador
*
puede usarse no solo en declaraciones de funciones, sino también cuando se llaman.
Estimados lectores! ¿Qué parámetros usa con más frecuencia cuando declara las funciones de Python?
