Empaquetar y desempaquetar argumentos en Python

Usamos dos operadores * (para tuplas) y ** (para diccionarios).
 

Antecedentes 
Considere una situación en la que tenemos una función que recibe cuatro argumentos. Queremos hacer una llamada a esta función y tenemos una lista de tamaño 4 que tiene todos los argumentos para la función. Si simplemente pasamos una lista a la función, la llamada no funciona. 
 

Python3

# A Python program to demonstrate need
# of packing and unpacking
 
# A sample function that takes 4 arguments
# and prints them.
def fun(a, b, c, d):
    print(a, b, c, d)
 
# Driver Code
my_list = [1, 2, 3, 4]
 
# This doesn't work
fun(my_list)

Producción : 

TypeError: fun() takes exactly 4 arguments (1 given)

  
Desempaquetar 
Podemos usar * para desempaquetar la lista de modo que todos los elementos de la misma se puedan pasar como parámetros diferentes.
 

Python3

# A sample function that takes 4 arguments
# and prints the,
def fun(a, b, c, d):
    print(a, b, c, d)
 
# Driver Code
my_list = [1, 2, 3, 4]
 
# Unpacking list into four arguments
fun(*my_list)

Producción : 

(1, 2, 3, 4)

Tenemos que tener en cuenta que el no. de argumentos debe ser igual a la longitud de la lista que estamos desempaquetando para los argumentos.

Python3

# Error when len(args) != no of actual arguments
# required by the function
 
args = [0, 1, 4, 9]
 
 
def func(a, b, c):
    return a + b + c
 
 
# calling function with unpacking args
func(*args)

Producción:

Traceback (most recent call last):
  File "/home/592a8d2a568a0c12061950aa99d6dec3.py", line 10, in <module>
    func(*args)
TypeError: func() takes 3 positional arguments but 4 were given

Como otro ejemplo, considere la función range() incorporada que espera argumentos de inicio y detención separados. Si no están disponibles por separado, escriba la llamada de función con el operador * para desempaquetar los argumentos de una lista o tupla: 

Python3

>>>
>>> range(3, 6)  # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)  # call with arguments unpacked from a list
[3, 4, 5]

Empaquetado 
Cuando no sabemos cuántos argumentos se deben pasar a una función de python, podemos usar Empaquetado para empaquetar todos los argumentos en una tupla. 
 

Python3

# A Python program to demonstrate use
# of packing
 
# This function uses packing to sum
# unknown number of arguments
def mySum(*args):
    return sum(args)
 
# Driver code
print(mySum(1, 2, 3, 4, 5))
print(mySum(10, 20))

Producción: 
 

15
30

La función anterior mySum() hace ‘empaquetado’ para empaquetar todos los argumentos que recibe esta llamada de método en una sola variable. Una vez que tenemos esta variable ‘empaquetada’, podemos hacer cosas con ella que haríamos con una tupla normal. args[0] y args[1] le darían el primer y segundo argumento, respectivamente. Dado que nuestras tuplas son inmutables, puede convertir la tupla args en una lista para que también pueda modificar, eliminar y reorganizar elementos en i.
 

Embalaje y desembalaje 
A continuación se muestra un ejemplo que muestra tanto el embalaje como el desembalaje. 
 

Python3

# A Python program to demonstrate both packing and
# unpacking.
 
# A sample python function that takes three arguments
# and prints them
def fun1(a, b, c):
    print(a, b, c)
 
# Another sample function.
# This is an example of PACKING. All arguments passed
# to fun2 are packed into tuple *args.
def fun2(*args):
 
    # Convert args tuple to a list so we can modify it
    args = list(args)
 
    # Modifying args
    args[0] = 'Geeksforgeeks'
    args[1] = 'awesome'
 
    # UNPACKING args and calling fun1()
    fun1(*args)
 
# Driver code
fun2('Hello', 'beautiful', 'world!')

Producción: 
 

(Geeksforgeeks, awesome, world!)

** se usa para diccionarios 
 

Python3

# A sample program to demonstrate unpacking of
# dictionary items using **
def fun(a, b, c):
    print(a, b, c)
 
# A call with unpacking of dictionary
d = {'a':2, 'b':4, 'c':10}
fun(**d)

Producción:
 

2 4 10

Aquí ** descomprimió el diccionario utilizado con él y pasó los elementos del diccionario como argumentos de palabras clave a la función. Entonces, escribir «diversión (1, ** d)» era equivalente a escribir «diversión (1, b = 4, c = 10)».
 

Python3

# A Python program to demonstrate packing of
# dictionary items using **
def fun(**kwargs):
 
    # kwargs is a dict
    print(type(kwargs))
 
    # Printing dictionary items
    for key in kwargs:
        print("%s = %s" % (key, kwargs[key]))
 
# Driver code
fun(name="geeks", ID="101", language="Python")
Producción

<class 'dict'>
name = geeks
ID = 101
language = Python

Aplicaciones y puntos importantes 

  1. Se utiliza en la programación de sockets para enviar una gran cantidad de requests a un servidor.
  2. Se utiliza en el marco Django para enviar argumentos variables para ver funciones.
  3. Hay funciones contenedoras que requieren que pasemos argumentos variables.
  4. La modificación de los argumentos se vuelve fácil, pero al mismo tiempo la validación no es adecuada, por lo que deben usarse con cuidado.

Referencia: 
http://hangar.runway7.net/python/packing-unpacking-arguments
Este artículo es una contribución de Shwetanshu Rohatgi . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *