Guia Completo: Desvendando Parâmetros e Argumentos em Funções Python

Por Mizael Xavier
Guia Completo: Desvendando Parâmetros e Argumentos em Funções Python

Guia Completo de Parâmetros e Argumentos em Funções Python

As funções são blocos de construção fundamentais em Python e em muitas outras linguagens de programação. Elas encapsulam lógica reutilizável, tornando o código mais organizado, legível e manutenível. No coração da flexibilidade das funções Python está a maneira como elas lidam com a passagem de informações: através de parâmetros e argumentos. Compreender a distinção e as várias formas de utilizá-los é crucial para qualquer desenvolvedor Python que deseje escrever código eficiente e claro.

Frequentemente, os termos "parâmetro" e "argumento" são usados ​​de forma intercambiável, mas possuem significados distintos. Parâmetros são as variáveis listadas dentro dos parênteses na definição da função. Eles atuam como espaços reservados para os valores que a função espera receber. Argumentos, por outro lado, são os valores reais passados para a função quando ela é chamada (invocada).

Parâmetros Posicionais e Argumentos Posicionais

A forma mais básica de passar informações para uma função é através de argumentos posicionais. A ordem em que os argumentos são passados na chamada da função deve corresponder à ordem dos parâmetros na definição da função. Python associa os argumentos aos parâmetros com base em suas posições.

def descrever_pet(tipo_animal, nome_pet):
    """Exibe informações sobre um pet."""
    print(f"Eu tenho um {tipo_animal}.")
    print(f"Meu {tipo_animal} se chama {nome_pet.title()}.")

# Argumentos posicionais: 'cachorro' corresponde a tipo_animal, 'Willie' corresponde a nome_pet
descrever_pet('cachorro', 'Willie') 
# Saída:
# Eu tenho um cachorro.
# Meu cachorro se chama Willie.

A simplicidade é a força aqui, mas a ordem é rígida. Inverter os argumentos levaria a uma saída logicamente incorreta.

Parâmetros de Palavra-Chave e Argumentos de Palavra-Chave

Argumentos de palavra-chave libertam você da restrição da ordem. Ao chamar a função, você especifica explicitamente a qual parâmetro cada argumento pertence, usando o nome do parâmetro seguido por um sinal de igual e o valor. Isso melhora significativamente a clareza do código, especialmente para funções com muitos parâmetros.

def descrever_pet(tipo_animal, nome_pet):
    """Exibe informações sobre um pet."""
    print(f"Eu tenho um {tipo_animal}.")
    print(f"Meu {tipo_animal} se chama {nome_pet.title()}.")

# Argumentos de palavra-chave: a ordem não importa
descrever_pet(nome_pet='Harry', tipo_animal='hamster')
# Saída:
# Eu tenho um hamster.
# Meu hamster se chama Harry.

Você pode misturar argumentos posicionais e de palavra-chave, mas os posicionais devem vir sempre antes dos de palavra-chave.

Parâmetros com Valores Padrão (Opcionais)

É possível definir um valor padrão para um ou mais parâmetros na assinatura da função. Se um argumento para esse parâmetro não for fornecido durante a chamada da função, o valor padrão será utilizado. Isso torna certos argumentos opcionais.

# tipo_animal agora tem um valor padrão 'cachorro'
def descrever_pet(nome_pet, tipo_animal='cachorro'): 
    """Exibe informações sobre um pet."""
    print(f"Eu tenho um {tipo_animal}.")
    print(f"Meu {tipo_animal} se chama {nome_pet.title()}.")

# Chamando sem especificar tipo_animal (usa o padrão)
descrever_pet(nome_pet='Willie') 
# Saída:
# Eu tenho um cachorro.
# Meu cachorro se chama Willie.

# Chamando e especificando um tipo_animal diferente
descrever_pet(nome_pet='Harry', tipo_animal='hamster')
# Saída:
# Eu tenho um hamster.
# Meu hamster se chama Harry.

Parâmetros com valores padrão devem vir após quaisquer parâmetros sem valores padrão na definição da função.

Parâmetros Posicionais de Comprimento Variável: `*args`

E se você não souber quantos argumentos posicionais sua função precisará receber? Python oferece uma solução elegante com o parâmetro `*args` (o nome `args` é uma convenção, o importante é o asterisco `*`). Ele permite que uma função aceite um número arbitrário de argumentos posicionais, que são coletados em um tupla.

def fazer_pizza(tamanho, *ingredientes):
    """Resume a pizza que estamos prestes a fazer."""
    print(f"\nFazendo uma pizza tamanho {tamanho} com os seguintes ingredientes:")
    for ingrediente in ingredientes:
        print(f"- {ingrediente}")

fazer_pizza('grande', 'pepperoni')
fazer_pizza('média', 'mussarela', 'calabresa', 'cebola')

# Saída:
# Fazendo uma pizza tamanho grande com os seguintes ingredientes:
# - pepperoni

# Fazendo uma pizza tamanho média com os seguintes ingredientes:
# - mussarela
# - calabresa
# - cebola

O parâmetro `*args` deve vir após todos os parâmetros posicionais e de valor padrão.

Parâmetros de Palavra-Chave de Comprimento Variável: `**kwargs`

Similarmente ao `*args`, o parâmetro `**kwargs` (novamente, `kwargs` é a convenção, o importante são os dois asteriscos `**`) permite que uma função aceite um número arbitrário de argumentos de *palavra-chave*. Esses argumentos são coletados em um dicionário, onde as chaves são os nomes dos parâmetros (como strings) e os valores são os valores dos argumentos.

def construir_perfil(primeiro_nome, ultimo_nome, **info_usuario):
    """Constrói um dicionário contendo tudo que sabemos sobre um usuário."""
    perfil = {}
    perfil['primeiro_nome'] = primeiro_nome
    perfil['ultimo_nome'] = ultimo_nome
    for chave, valor in info_usuario.items():
        perfil[chave] = valor
    return perfil

perfil_usuario = construir_perfil('albert', 'einstein',
                                  localizacao='princeton',
                                  campo='física')
print(perfil_usuario)

# Saída:
# {'primeiro_nome': 'albert', 'ultimo_nome': 'einstein', 'localizacao': 'princeton', 'campo': 'física'}

O parâmetro `**kwargs` deve ser o último parâmetro na definição da função.

Ordem dos Parâmetros e Argumentos Avançados

A ordem geral para definir parâmetros em uma função Python é:

  1. Parâmetros posicionais obrigatórios.
  2. Parâmetros posicionais com valores padrão (opcionais).
  3. Parâmetro posicional de comprimento variável (`*args`).
  4. Parâmetros apenas de palavra-chave (obrigatórios ou com valores padrão).
  5. Parâmetro de palavra-chave de comprimento variável (`**kwargs`).

Parâmetros Positional-Only (`/`)

Introduzidos no Python 3.8, os parâmetros positional-only, definidos antes de uma barra `/` na assinatura da função, só podem ser passados por posição, não por palavra-chave. Isso pode ser útil para evitar ambiguidades ou para manter a compatibilidade com APIs C.

def exemplo_pos_only(a, b, /):
    print(a, b)

exemplo_pos_only(1, 2) # Válido
# exemplo_pos_only(a=1, b=2) # Inválido -> TypeError

Parâmetros Keyword-Only (`*`)

Parâmetros definidos após um asterisco `*` (ou após `*args` se presente) são keyword-only. Eles só podem ser passados usando argumentos de palavra-chave. Isso melhora a legibilidade e a intenção do código, forçando o chamador a ser explícito.

def exemplo_kw_only(*, c, d='padrão'):
    print(c, d)

exemplo_kw_only(c=3) # Válido, d usa o padrão
exemplo_kw_only(c=3, d=4) # Válido
# exemplo_kw_only(3) # Inválido -> TypeError

Combinando Tipos de Parâmetros

Você pode combinar todos esses tipos para criar assinaturas de função muito flexíveis e expressivas.

def func_combinada(pos1, pos2, /, pos_ou_kw, *, kw_only1, kw_only2='default'):
    print(f"Positional-Only: {pos1}, {pos2}")
    print(f"Positional or Keyword: {pos_ou_kw}")
    print(f"Keyword-Only: {kw_only1}, {kw_only2}")

func_combinada(1, 2, 3, kw_only1='val1')
func_combinada(1, 2, pos_ou_kw=3, kw_only1='val1', kw_only2='val2')

Conclusão: Escrevendo Funções Claras e Flexíveis

Dominar os diferentes tipos de parâmetros e argumentos em Python é essencial para escrever funções que não são apenas funcionais, mas também claras, flexíveis e fáceis de usar. Desde simples argumentos posicionais até combinações avançadas com `*args`, `**kwargs`, positional-only e keyword-only, Python oferece as ferramentas para definir interfaces de função que se adaptam às suas necessidades. Usar essas ferramentas corretamente, seguindo convenções e priorizando a legibilidade, contribui enormemente para a qualidade e manutenibilidade do seu código. Para referência definitiva, a documentação oficial do Python é sempre o melhor recurso.

Mizael Xavier

Mizael Xavier

Desenvolvedor e escritor técnico

Ver todos os posts

Compartilhar: