Funções em Python: entendendo parâmetros, argumentos, *args e **kwargs

Guilherme Reis
luizalabs
Published in
3 min readNov 1, 2019

Funções em Python são blocos de código que executarão algum tipo de tarefa ou manipulação de dados, podendo ou não receber: dados de entrada (parâmetros/argumentos).

Parâmetros: são os nomes dados aos atributos que uma função pode receber. Definem quais argumentos são aceitos por uma função, podendo ou não ter um valor padrão (default).

Argumentos: são os valores que realmente são passados para uma função.

Veja a simples função abaixo:

No exemplo acima na função calculadora_salario, definimos dois parâmetros que são chamados de valor e horas. O parâmetro valor não possui um valor default, então é obrigatório passá-lo como argumento. Já o parâmetro horas possui um valor default, o que o torna a passagem do argumento não obrigatório, assim é assumido o valor 220. Caso não passarmos o argumento para o parâmetro valor recebemos o seguinte erro:

Traceback (most recent call last):
File "learn_decorators.py", line 41, in <module>
print(calculadora_salario())
TypeError: calculadora_salario() missing 1 required positional argument: 'valor'

Note que os parâmetros obrigatórios devem ser colocados antes de qualquer parâmetro default (da esquerda para direita), para que não ocorra uma confusão no interpretador e ocorra o erro:


SyntaxError: non-default argument follows default argument

Agora que entendemos obrigatoriedade de parâmetros, vamos analisar o uso dos parâmetros *args e **kwargs .

Para começo de conversa, as palavras args e kwargs são apenas usadas como convenção, ou seja, poderiam ter qualquer outro nome, por exemplo: *parms e **kwparms.

*args

É usado para passar um lista de argumentos variável sem palavras-chave em forma de tupla, pois a função que o recebe não necessariamente saberá quantos argumentos serão passados.

Exemplo:

# Output:
tipo: <class 'tuple'> conteúdo: (1, 'A', {'valor': 10})
tipo: <class 'int'> conteúdo: 1
tipo: <class 'str'> conteúdo: A
tipo: <class 'dict'> conteúdo: {'valor': 10}

No exemplo acima temos uma função que recebe um parâmetro do tipo *args com alguns argumentos e escreve no terminal o tipo e o conteúdo, junto com o tipo e conteúdo de cada argumento da tupla.

**kwargs

Como a abreviação sugere, kwargs significa keyword arguments (argumentos de palavras chave). Ele permite passar um dicionário com inúmeras keys para a função.

Exemplo:

# Output
tipo: <class 'dict'> conteúdo: {'nome': 'James', 'sobrenome': 'Bond', 'cargo': 'Agente 007'}
atributo: nome, valor: James
atributo: sobrenome, valor: Bond
atributo: cargo, valor: Agente 007

Como vimos acima no output da função usando ** podemos notar que o tipo do argumento é passado como dicionário com chaves e valores.

Outra forma de passar um dicionário já existente é usando os ** na passagem do parâmetro:

parms = {
'nome': 'James',
'sobrenome': 'Bond',
'cargo': 'Agente 007'
}
func_kwargs(**parms)

Agora para finalizar vamos ver como ficaria um função usando todos os parâmetros que vimos.

# Output
Nome do agente: James Bond
Função: agente
('Missão 1', 'Missão 2')
{'id_agente': '007', 'proxima_missao': 'Impossível'}

No exemplo acima, usamos todos os recursos mencionados no post:

  • O parâmetro nome recebe o valor “James Bond”;
  • O parâmetro função utilizou o valor “agente” definido como default;
  • O parâmetro args recebeu os valores “Missao 1” e “Missao 2” como tupla;
  • O parâmetro kwargs recebeu dois parâmetros nomeados como dicionário: {‘id_agente’: ‘007’, ‘proxima_missao’: ‘Impossível’}

Por hoje é isso pessoal, aprendemos um pouco sobre esse recurso muito interessante da linguagem Python. Espero ter ajudado no entendimento dessas palavrinhas especiais para construção de funções. Até a próxima.

--

--