No desenvolvimento de software, frequentemente nos deparamos com a necessidade de criar funções flexíveis, capazes de lidar com um número variável de argumentos. Em Python, isso é possível utilizando os conceitos de *args e **kwargs. Neste tutorial, vamos explorar como criar e utilizar funções com número arbitrário de argumentos em Python.
O que são *args e **kwargs?
Em Python, *args e **kwargs são usados para permitir que uma função aceite um número variável de argumentos.
*argspermite que você passe um número variável de argumentos posicionais para uma função.**kwargspermite que você passe um número variável de argumentos nomeados (ou argumentos com palavra-chave) para uma função.
Exemplo Básico com *args
Vamos começar com um exemplo simples de uma função que soma um número arbitrário de valores:
def somar(*valores):
    return sum(valores)
resultado = somar(1, 2, 3, 4)
print(resultado)  # Saída: 10TestarNeste exemplo, a função somar pode receber qualquer quantidade de argumentos e somá-los. O operador * antes do parâmetro valores indica que todos os argumentos passados para a função serão acumulados em uma tupla.
Exemplo Básico com **kwargs
Agora, vejamos um exemplo de uma função que exibe argumentos passados com e sem palavra-chave:
def exibe_argumentos(*args, **kwargs):
    print(f'Argumentos passados sem palavra-chave: {args}')
    print(f'Argumentos passados com palavra-chave: {kwargs}')
exibe_argumentos(1, 2, 3, nome='Juliano', idade=30)TestarNeste exemplo, *args captura os argumentos posicionais em uma tupla, enquanto **kwargs captura os argumentos nomeados em um dicionário.
Utilizando *args e **kwargs Juntos
Você pode combinar *args e **kwargs em uma única função para aceitar tanto argumentos posicionais quanto nomeados:
def funcao_completa(a, b, *args, **kwargs):
    print(f'a: {a}')
    print(f'b: {b}')
    print(f'args: {args}')
    print(f'kwargs: {kwargs}')
funcao_completa(1, 2, 3, 4, 5, nome='Juliano', idade=30)TestarA saída será:
a: 1
b: 2
args: (3, 4, 5)
kwargs: {'nome': 'Juliano', 'idade': 30}Desmembrando Argumentos na Chamada de Funções
Você também pode usar os operadores * e ** para desmembrar sequências ou dicionários na hora de chamar uma função:
valores = [1, 2, 3]
dic = {'nome': 'Juliano', 'idade': 30}
exibe_argumentos(*valores, **dic)TestarNeste caso, a lista valores e o dicionário dic são desmembrados em argumentos individuais.
Decoradores e Funções com Número Arbitrário de Argumentos
Os decoradores em Python frequentemente utilizam *args e **kwargs para garantir que possam decorar qualquer função, independentemente do número e tipo de argumentos que ela aceita.
def meu_decorador(func):
    def wrapper(*args, **kwargs):
        print("Executando algo antes da função")
        resultado = func(*args, **kwargs)
        print("Executando algo depois da função")
        return resultado
    return wrapper
@meu_decorador
def dizer_oi(nome):
    print(f'Olá, {nome}!')
dizer_oi('Juliano')TestarA saída será:
Executando algo antes da função
Olá, Juliano!
Executando algo depois da funçãoConclusão
Funções com número arbitrário de argumentos em Python são extremamente úteis para criar funções flexíveis e reutilizáveis. Utilizando *args e **kwargs, você pode criar funções que aceitam qualquer quantidade de argumentos posicionais e nomeados, tornando seu código mais robusto e adaptável a diferentes situações.
Experimente utilizar *args e **kwargs em seus próprios projetos e veja como eles podem simplificar a manipulação de argumentos em suas funções!
      Cursos de programação gratuitos com certificado
Aprenda a programar e desenvolva soluções para o seu trabalho com Python para alcançar novas oportunidades profissionais. Aqui na Asimov você encontra:
- Conteúdos gratuitos
 - Projetos práticos
 - Certificados
 - +20 mil alunos e comunidade exclusiva
 - Materiais didáticos e download de código
 
    
    
    
    
    
Comentários
30xp