15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

offset += 1

if letter == ' ':

yield offset

Rodar o gerador produz o mesmo resultado:

with open('/tmp/address.txt', 'r') as f:

it = index_file(f)

results = islice(it, 0, 3)

print(list(results))

>>>

[0, 5, 11]

A única pegadinha na definição de geradores é que os chamadores devem estar

cientes de que os iteradores devolvidos pelo gerador administram seu estado

(stateful) e, portanto, não podem ser reutilizados (consulte o Item 17: “Seja

conservador quando iterar sobre argumentos”).

Lembre-se

• Empregar geradores pode tornar seu código mais claro e legível que a

alternativa de retornar listas de resultados acumulados.

• O iterador devolvido pelo gerador produz um conjunto de valores passados

para as expressões yield, que estão dentro do corpo da função geradora.

• Os geradores podem produzir uma sequência de valores de saída a partir de

valores de entrada arbitrariamente grandes porque a memória de trabalho não

inclui o conjunto completo de todas as entradas e saídas.

Item 17: Seja conservador quando iterar sobre

argumentos

Quando uma função toma uma lista de objetos como parâmetro, é importante

iterar sobre essa lista várias vezes. Por exemplo, digamos que se queira analisar

os números do turismo do estado americano do Texas. Imagine que o conjunto

de dados é o número de visitantes em cada cidade (em milhões de visitantes por

ano) e queremos descobrir a porcentagem de turismo que cada cidade recebe.

Para isso, é necessária uma função de normalização que soma, a partir dos dados

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!