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.

uma expressão geradora equivalente ao código anterior. Entretanto, a expressão

geradora imediatamente entrega o controle ao iterador e coloca o laço em espera.

it = (len(x) for x in open('/tmp/my_file.txt'))

print(it)

>>>

<generator object <genexpr> at 0x101b81480>

O iterador pode ser avançado um passo por vez para produzir o próximo

resultado da expressão geradora quando necessário (usando a função nativa

next). O código pode consumir o resultado da expressão geradora sempre que

necessário sem esgotar a memória.

print(next(it))

print(next(it))

>>>

100

57

Outro ponto forte das expressões geradoras é que elas podem ser compostas. No

exemplo a seguir, tomamos o iterador devolvido pela expressão geradora acima e

o usamos como entrada para outra expressão geradora.

roots = ((x, x**0.5) for x in it)

Cada vez que o iterador avança, o iterador interno também avança, criando um

efeito dominó no laço, testando as expressões condicionais e repassando

entradas e saídas.

print(next(roots))

>>>

(15, 3.872983346207417)

Geradores aninhados como este executam de forma veloz no Python. Se estiver

procurando uma maneira de criar alguma funcionalidade que precise manipular

um fluxo muito intenso de dados de entrada, as expressões geradoras são a

melhor ferramenta. A única pegadinha é que os iteradores devolvidos pelas

expressões geradoras guardam seus estados (stateful), portanto é preciso ter

cuidado para não usá-los mais de uma vez (consulte o Item 17: “Seja

conservador quando iterar sobre argumentos”).

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!