Desempacotamento e Empacotamento de Parâmetros em Funções - Python
Uma das áreas comuns onde o empacotamento e o desempacotamento são aplicados é nos parâmetros de funções. É comum observar em definições de funções a presença de parâmetros como *args
**kwargs
Os termos args e kwargs são convenções de programação em Python, mas é possível usar qualquer nome no lugar deles. O *args
**kwargs
O operador *
**
*args
O operador *
def fun(*args):
# acessa o primeiro elemento da tupla
print(args[0])
# imprime toda a tupla
print(args)
fun("Python", "C++", "Java", "C#")
Neste exemplo, a função fun
Python ('Python', 'C++', 'Java', 'C#')
Com essa funcionalidade, podemos passar para a função uma quantidade variável de argumentos:
def sum(*args):
result = 0
for arg in args:
result += arg
return result
print(sum(1, 2, 3)) # 6
print(sum(1, 2, 3, 4)) # 10
print(sum(1, 2, 3, 4, 5)) # 15
**kwargs
O operador **
def fun(**kwargs):
print(kwargs) # imprime o dicionário
fun(name="Tom", age="38", company="Google")
fun(language="Python", version="3.11")
A saída do programa será:
{'name': 'Tom', 'age': '38', 'company': 'Google'} {'language': 'Python', 'version': '3.11'}
Dentro da função, podemos acessar os valores dos argumentos pelo nome das chaves:
def fun(**kwargs):
for key in kwargs:
print(f"{key} = {kwargs[key]}")
fun(name="Tom", age="38", company="Google")
A saída do programa será:
name = Tom age = 38 company = Google
Desempacotamento de Argumentos
Até agora, mostramos como os operadores *
**
Operador * e Desempacotamento
Vamos começar com uma situação em que o desempacotamento é útil. Suponha que estamos passando uma tupla para uma função:
def sum(*args):
result = 0
for arg in args:
result += arg
return result
numbers = (1, 2, 3, 4, 5)
print(sum(numbers))
Nesse caso, a tupla numbers
*args
TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
Para que os elementos da tupla sejam passados individualmente, é necessário fazer o desempacotamento:
def sum(*args):
result = 0
for arg in args:
result += arg
return result
numbers = (1, 2, 3, 4, 5)
# aplicando desempacotamento - *numbers
print(sum(*numbers)) # 15
Aqui, *numbers
Outro exemplo de desempacotamento é quando uma função recebe múltiplos parâmetros, mas queremos passar um único objeto iterável:
def print_person(name, age, company):
print(f"Name: {name}, Age: {age}, Company: {company}")
person = ("Tom", 38, "Google")
# desempacotando a tupla person
print_person(*person) # Name: Tom, Age: 38, Company: Google
Nesse caso, *person
name
age
company
Operador ** e Desempacotamento
O operador **
def print_person(name, age, company):
print(f"Name: {name}, Age: {age}, Company: {company}")
tom = {"name": "Tom", "age": 38, "company": "Google"}
# desempacotando o dicionário tom
print_person(**tom) # Name: Tom, Age: 38, Company: Google
Aqui, **tom
name
age
company
Combinação de Parâmetros
Os parâmetros *args
**kwargs
def sum(num1, num2, *nums):
result = num1 + num2
for n in nums:
result += n
return result
print(sum(1, 2, 3)) # 6
print(sum(1, 2, 3, 4)) # 10