Número de argumentos variável em funções

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)
Legal, não? Em um próximo post, vou falar de dicionários com argumentos nomeados.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s