Além das
funções geradoras, o
Python 2.4 disponibiliza outro tipo de geradores, as
expressões geradoras. Estas são bem mais sucintas, e potencialmente mais úteis para filtrar listas.
Tomemos então uma lista
aList, contendo inteiros aleatórios positivos e negativos. Para obtermos o somatório de todos os elementos positivos poderíamos fazer
*...
s = sum(filter(lambda x: x > 0, aList))
print s
Mas... como a função
filter() retorna uma nova lista, estamos a consumir memória desnecessariamente. Especialmente grave se a lista
aList for muito grande.
Com uma expressão geradora nunca é criada uma nova lista, sendo esta substituída por um iterador que apenas retorna os elementos que verificam a condição dada. Assim, o mesmo resultado obter-se-ia fazendo...
s = sum(item for item in aList if item > 0)
print s
O que, usando funções geradoras, seria equivalente a escrever...
def positive(aList):
for item in aList:
if item > 0:
yield item
s = sum(positive(aList))
print s
Vá lá... toca a
aprender Python. Se estão a usar Linux ou MacOS X já o devem ter instalado, se estão a usar Windows é só fazer o
download...
Referências:
* A expressão "lambda x: x > 0" cria uma função anónima que aceita um parâmetro x, e retorna o resultado da expressão "x > 0".