Blog em português onde relato a minha aprendizagem de Python. Sendo um blog, ele deve ser lido de baixo para cima e é escrito orientado a uma audiência com alguns conhecimentos de programação. Não tentando ser uma fonte exaustiva de conhecimento sobre Python, pode, no entanto, servir como crash course a esta linguagem.

Tuesday, June 30, 2009

Lambdas e geradores

A expressão lambda cria uma função sem associar-lhe qualquer nome. Assim, a expressão
lambda parametros : expressão

constroi uma função com código equivalente a:
def anonimo(parametros):
  return expressao

excepto pelo facto de alterar a ligacao ao nome anonimo

Exemplos:
>>> quadrado=(lambda x : x*x)
>>> quadrado
at 0x028DA6B0>
>>> quadrado(3)
9
>>>



Geradores (Generators):
Um gerador é qualquer função que contenha pelo menos uma keywork yield. Ao chamar uma função deste tipo, o corpo da função não é executada. Pelo contrário, ao chamar um gerador, é criado um iterador especial que contêm a função, as suas variáveis locais (e parâmetros) e o ponto actual de execução, que é inicialmente definido como o início da função. Ao chamar o método next deste gerador, a execução da função retoma do ponto actual até ao primeiro yield. De uma forma muito práctica, um yield é como um return pois permite retornar um valor para o contexto mas quando a sua execução retoma esta é retomada a partir do yield em vez do início da função. Exemplo:
Imagine-se que queremos uma sequência de números de 1 a N e depois até 1 de novo. (Tirado de Python in a nutshell - Alex Martelli):
def updown(n):
  for x in xrange(1, n): 
    yield x
  for x in xrange(n, 0, -1):
    yield x

Exemplo de utilização:
for i in updown(3): print i
imprime 1,2,3,2,1