Usar argumentos de variáveis em Python
Em Python, você pode usar qualquer número de argumentos e argumentos de palavra-chave sem declarar cada um deles. Essa capacidade é útil quando uma função pode obter um número desconhecido de entradas.
Argumentos variáveis
Argumentos em funções são necessários. Mas quando você está usando argumentos variáveis, a função permite que qualquer número de argumentos (incluindo 0
) seja passado. A sintaxe para usar argumentos de variável é prefixar um único asterisco (*
) antes do nome do argumento.
A função a seguir imprime os argumentos recebidos:
def variable_length(*args):
print(args)
Nota
Não é necessário chamar argumentos args
variáveis. Você pode usar qualquer nome de variável válido. Embora seja comum ver *args
ou *a
, você deve tentar usar a mesma convenção ao longo de um projeto.
Neste caso, *args
está instruindo a função a aceitar qualquer número de argumentos (incluindo 0
). Dentro da função, args
está agora disponível como a variável que contém todos os argumentos como uma tupla. Experimente a função passando qualquer número ou tipo de argumentos:
variable_length()
()
variable_length("one", "two")
('one', 'two')
variable_length(None)
(None,)
Como você pode ver, não há restrição quanto ao número ou tipo de argumentos passados.
Um foguete passa por várias etapas antes de um lançamento. Dependendo das tarefas ou atrasos, essas etapas podem levar mais tempo do que o planejado. Vamos criar uma função de comprimento variável que pode calcular quantos minutos até o lançamento, dado quanto tempo cada etapa vai levar:
def sequence_time(*args):
total_minutes = sum(args)
if total_minutes < 60:
return f"Total time to launch is {total_minutes} minutes"
else:
return f"Total time to launch is {total_minutes/60} hours"
Experimente a função passando qualquer número de minutos:
sequence_time(4, 14, 18)
Total time to launch is 36 minutes.
sequence_time(4, 14, 48)
Total time to launch is 1.1 hours.
Nota
Quando você usa argumentos de variável, cada valor não recebe mais um nome de variável. Todos os valores agora fazem parte do nome da variável catch-all que usa o asterisco (args
nestes exemplos).
Argumentos de palavras-chave variáveis
Para que uma função aceite qualquer número de argumentos de palavra-chave, use uma sintaxe semelhante. Neste caso, é necessário um duplo asterisco:
def variable_length(**kwargs):
print(kwargs)
Experimente a função de exemplo, que imprime os nomes e valores passados como kwargs
:
variable_length(tanks=1, day="Wednesday", pilots=3)
{'tanks': 1, 'day': 'Wednesday', 'pilots': 3}
Se você já estiver familiarizado com dicionários Python, notará que argumentos de palavra-chave de comprimento variável são atribuídos como um dicionário. Para interagir com as variáveis e valores, use as mesmas operações que um dicionário.
Nota
Assim como acontece com argumentos variáveis, você não é obrigado a usar kwargs
quando estiver usando argumentos de palavra-chave variável. Você pode usar qualquer nome de variável válido. Embora seja comum ver **kwargs
ou **kw
, você deve tentar usar a mesma convenção ao longo de um projeto.
Nesta função, vamos usar argumentos de palavras-chave variáveis para relatar os astronautas designados para a missão. Como essa função permite qualquer número de argumentos de palavras-chave, ela pode ser reutilizada independentemente do número de astronautas atribuídos:
def crew_members(**kwargs):
print(f"{len(kwargs)} astronauts assigned for this mission:")
for title, name in kwargs.items():
print(f"{title}: {name}")
Experimente com a tripulação da Apollo 11:
crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", command_pilot="Michael Collins")
3 astronauts assigned for this mission:
captain: Neil Armstrong
pilot: Buzz Aldrin
command_pilot: Michael Collins
Como você pode passar qualquer combinação de argumentos de palavras-chave, certifique-se de evitar palavras-chave repetidas. Palavras-chave repetidas resultam em um erro:
crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", pilot="Michael Collins")
File "<stdin>", line 1
SyntaxError: keyword argument repeated: pilot