quinta-feira, 3 de novembro de 2011

Funções em Python

Funções em Python são definidas com a palavra def, seguidas pelo seu nome, além de parênteses. Dentro dos parênteses, existe a possibilidade de se incluir uma lista de parâmetros. No início do corpo da função, é uma boa prática fazer um comentário, chamado de docstrings. Usando docstrings, ferramentas podem utilizar o comentário para a documentação do sistema. Funções em Python podem ter a opção de retornar algum valor, uma lista, um objeto, etc ou podem não retornar nada, se portando como um procedimento.
>>> def fib(n): 
...     """Imprime uma série de Fibonacci para o parâmetro n."""
...     a, b = 0, 1
...     while a < n:
...         print a,
...         a, b = b, a+b
...
>>> # Chamando a função
... fib(2000)

>>> def fib2(n): 
...     """Returnondo uma lista contendo uma série de Fibonacci para n."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)   
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100) 
Podemos ter um variável número de argumentos na lista, com valores default ou não. Para valores default, não existe a necessidade de se passar esse valor para a função. Além disso, não é necessário passar os argumentos para a função na ordem dos parâmetros, desde que utilizemos um par nome=valor.
>>> def funcaoComArgumento(arg1, arg2="valor_default", arg3="valor_default")
       ...

      #chamadas a função
      funcaoComArgumento(100)
      funcaoComArgumento(arg2="qualquercoisa", arg1=100)
      # ocorrerá um erro para a chamada a seguir pois não existe um valor default para arg1 
      funcaoComArgumento(arg2="qualquercoisa")  
Finalizando, parâmetros com a forma **name recebem um dicionário e com a forma *name recebem tuplas. Os parâmetros que recebem dicionários devem, obrigatoriamente serem os últimos parâmetros da função.
def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, "?"
    print "-- I'm sorry, we're all out of", kind
    for arg in arguments:
        print arg
    print "-" * 40
    keys = sorted(keywords.keys())
    for kw in keys:
        print kw, ":", keywords[kw]

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper='Michael Palin',
           client="John Cleese",
           sketch="Cheese Shop Sketch")

-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch