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.

Wednesday, July 8, 2009

list comprehensions e generator expressions

Como se viu na criação de listas e dicionários, Python tem formas muito sucintas de criar objectos complexos.
Qualquer programador sabe que é muito comum criar listas cujos elementos são computados no momento. Normalmente usa-se uma qualquer forma de iteração, onde o elemento é primeiro calculado e depois posto dentro da lista. Python suporta esta funcionalidade de uma forma muito simpática, chamada de list comprehensions.

list comprehensions
Uma list comprehension é uma expressão e tem a seguinte sintaxe:


[expression for target in iterable lc-clauses ]

target e expressao têm a mesma semântica que no for.
lc-clauses consiste numa sequência de 0 ou + clausulas, cada uma com a seguinte sintaxe:
for target in iterable
OU
if expression

Exemplos[1] (a lista resultante será posta numa variável para maior claridade):
result = [x+1 for x in someSequence]
significa exactamente o mesmo que:
result = []
for x in someSequence:
  result.append(x+1)

i.e. Para cada elemento de someSequence, este elemento é associado a target,(neste caso x), e expression é avaliada (neste caso x+1) e o seu resultado posto numa lista nova.

Penso que as list comprehensions são uma forma muito expressiva de executar idiomas muito comuns. Vejamos mais exemplos:


result = [x+1 for x in someSequence if x>23]
aqui, depois de x ser associado ao valor vindo de someSequence, a expressão dentro do if é avaliada e se for True então o resultado da avaliação de expression é posto na lista.


Um último exemplo, neste caso usando uma lc-clause na forma de for:
result = [x+y for x in someSequence for y in another]
o que é equivalente a:
result = []
for x in someSequence:
  for y in another:
    result.append(x+y)


[1] - Exemplos retirados de Python in a nutshell - Alex Martelli