Para quem não sabe, Python possui uma sintaxe que permite que definamos uma função com um número indefinido de argumentos. Isso pode ser feito através do * (asterisco). Por exemplo:
def func(x, *args):
print x
print args
func(1, 2, 3, 4, 5)
Execute o código acima, e verá a seguinte saída:
1 (2, 3, 4, 5)
Ou seja, o primeiro argumento fornecido pelo usuário (o inteiro 1) é atribuído ao primeiro parâmetro da função. Os argumentos restantes (os inteiros 2, 3, 4 e 5) são empacotados em uma tupla e passados ao parâmetro *args. Desse modo, os elementos de args podem ser acessados como os elementos de uma tupla qualquer, seja por índice, ou realizando uma travessia com for in. Por exemplo, uma função que realiza a soma de todos os argumentos recebidos:
def soma(*args): result = 0 for elem in args: result += elem return result soma(1, 2, 3, 4, 5)
A saída da execução do código acima será a soma dos valores 1, 2, 3, 4 e 5, que é 15.
Também podemos usar o * em frente ao nome de sequências (como tuplas, listas,) para fazer com que os valores que compõem tais sequências sejam desmembrados e passados como argumentos para funções. Considere e função func() abaixo:
def func(a,b,c,d): print a,b
Ela possui 4 parâmetros (aqui representados pelas variáveis a, b, c, d) e imprime os valores de a e de b. Certo. Imagine agora que você possui uma lista com 4 valores, que deseja passar para a função func(). Poderia fazer o seguinte:
l = [1, 2, 3, 4] func(l[0], l[1], l[2], l[3])
Correto? Sim. Mas dá pra fazer melhor. E se eu quisesse passar a lista toda para a função, sem precisar acessar os elementos individuais.
l = [1, 2, 3, 4] func(l)
Errado! Afinal, a função espera 4 valores e estamos passando somente um, uma lista. É aí que podemos usar o *. Veja:
l = [1, 2, 3, 4] func(*l)