15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Lembre-se

• As abrangências de lista suportam múltiplos níveis de laço e múltiplas

condições em cada nível.

• Abrangências de lista com mais de duas expressões são muito difíceis de ler e

devem ser evitadas.

Item 9: Considere usar expressões geradoras em

abrangências muito grandes

O problema com as abrangências de lista (consulte o Item 7: “Use abrangências

de lista em vez de map e filter”) é que podem criar uma nova lista contendo um

item para cada valor na sequência de entrada. Para sequências de entrada

pequenas isso passa despercebido, mas sequências grandes podem consumir

quantidades significativas de memória, causando uma falha grave que

interrompe o programa.

Por exemplo, digamos que se queira ler um arquivo e retornar o número de

caracteres em cada linha. Com uma abrangência de lista precisaríamos guardar

na memória cada linha presente no arquivo. Se este for absurdamente

gigantesco, ou se for (por exemplo) um socket de rede que é, por natureza, de

tamanho infinito (o fim do arquivo nunca chega), teremos um grande problema

se estivermos usando abrangências de lista. No exemplo a seguir, a abrangência

de lista usada consegue lidar apenas com valores de entrada pequenos.

value = [len(x) for x in open('/tmp/my_file.txt')]

print(value)

>>>

[100, 57, 15, 1, 12, 75, 5, 86, 89, 11]

A solução, em Python, é empregar as chamadas expressões geradoras, uma

generalização das abrangências de listas e dos geradores. As expressões

geradoras não materializam a sequência de saída completa quando são

executadas. Em vez disso, as expressões geradoras fazem uso de um elemento de

iteração que captura um item por vez na expressão.

Uma expressão geradora pode ser criada colocando entre parênteses ( ) uma

sintaxe parecida com a das abrangências de lista. No exemplo a seguir temos

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!