Ver Feed RSS

root@blog:/# chmod o+r *

[Curso de Python] Funções Com Argumentos Indefinidos - Parte 1/2

Avalie este Post de Blog

Antes de prosseguir leia os artigos anteriores aqui.



No último post falamos mais um pouco sobre os argumentos de uma função mas mesmo assim ainda não acabamos de cobrir todo o assunto. O Python é um linguagem muito extensa e com diversas funcionalidades. Hoje vamos ver a primeira parte de argumentos indefinidos, ou também conhecidos como *args e **kwargs.



Funções Com Argumentos Indefinidos - Parte 1/2



Como vimos, anteriormente podemos declarar funções sem argumentos, funções com argumentos fixos, e funções com argumentos não obrigatórios (valores padrões). Mas se uma função precisa levar muitos argumentos chegando a ser complicado definir todos podemos usar o recurso dos argumentos indefinidos.

Primeiramente vamos aprender a usar uma tupla como "container" de argumentos, geralmente referenciado como *args. Vale ressaltar que o nome da variável após o * pode ser qualquer outra palavra que defina o que serão os seus itens. Vamos a um exemplo:

Código :
>>> def teste_args(*args):
...     print 'args =',args
...
>>> teste_args()
args = ()
>>> teste_args(1,2,3)
args = (1, 2, 3)
>>> teste_args(1,2,3,4,5,6,7,8,9)
args = (1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> teste_args(1,2, 'abc', [9,8,7])
args = (1, 2, 'abc', [9, 8, 7])
>>>
Como podemos ver, a tupla args recebe qualquer quantidade de argumentos mantendo sua ordem para uma correta decodificação. Desta maneira podemos elaborar uma função que processe todos os argumentos por exemplo, uma função que retorne a soma de todos os argumentos:

Código :
>>> def soma(*args):
...     resultado = 0
...     for numero in args:
...         resultado = resultado + numero
...     print 'resultado =',resultado
...
>>>
>>>
>>> soma(1,2)
resultado = 3
>>> soma(1,2,3)
resultado = 6
>>> soma(1,2,3,4,5,6,7,8,9,10)
resultado = 55
>>>
Uma vez que temos infinitos argumentos possíveis, pode vir a ser necessário utilizar uma lista/tupla para armazenar todos os argumentos antes de passa-los para a função. Vamos supor que nosso programa levantou uma lista de números (por exemplo, passado pelo usuário) e irá passá-los para a função de soma. Isso implica em um pequeno detalhe. Vamos ver o que ocorreria se passarmos a lista/tupla normalmente:

Código :
>>> def teste(*args):
...     print 'args =',args
...     n = 0
...     for arg in args:
...         print 'arg',n,'=',arg
...
>>> teste(1,2,3,4)
args = (1, 2, 3, 4)
arg 0 = 1
arg 0 = 2
arg 0 = 3
arg 0 = 4
>>> l = (1,2,3,4)
>>> teste(l)
args = ((1, 2, 3, 4),)
arg 0 = (1, 2, 3, 4)
>>>
Podemos ver que o *args "envelopa" a lista l como sendo o seu primeiro elemento. ao tentar realizar essa soma iríamos obter um erro. Para utilizar a funcionalidade do *args e ao mesmo tempo passar uma lista/tupla, precisamos "desempacotá-lo":

Código :
>>> def teste(*args):
...     print 'args =',args
...     n = 0
...     for arg in args:
...         print 'arg',n,'=',arg
...
>>> def soma(*args):
...     resultado = 0
...     for numero in args:
...         resultado = resultado + numero
...     print 'resultado =',resultado
...
>>> l = (1,2,3)
>>> teste(*l)
args = (1, 2, 3)
arg 0 = 1
arg 0 = 2
arg 0 = 3
>>>
>>> soma(*l)
resultado = 6
>>>
como podemos ver, um simples * pode fazer toda a diferença!

Boa semana a todos e até a próxima...

Atualizado 01-09-2010 em 09:54 por Magnun

Categorias
Artigos , Artigos , Cursos , Curso de Python

Comentários

  1. Avatar de tuxdahora
    Parabéns pela 40ª aula sobre Python, no Under-Linux :-D

    Para os interessados em acessar o curso inteiro, na ordem crescente das aulas, veja esse post atualizado:

    - Curso de Python Gratuito no Under-Linux
  2. Avatar de neiesc
    Muito bom o curso, li na revista espirito livre 16, na parte de noticis sobre o curso aqui. Revista Espírito Livre
  3. Avatar de Magnun
    Neiesc, obrigado por avisar, não sabia que havia sido "linkado" por eles. Até mais...
  4. Avatar de fabraga
    o post da tuxdahora está desatualizado! só vai até a aula041.
    melhor seguir pela original mesmo!

+ Enviar Comentário