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.

casos muito simples.

Item 16: Prefira geradores em vez de retornar listas

A escolha mais simples para funções que produzem uma sequência de resultados

é retornar uma lista de itens. Por exemplo, digamos que se queira encontrar o

índice de cada palavra em uma string. No exemplo a seguir, os resultados são

acumulados em uma lista usando o método append e devolvendo essa lista no

final da função:

def index_words(text):

result = []

if text:

result.append(0)

for index, letter in enumerate(text):

if letter == ' ':

result.append(index + 1)

return result

O exemplo funciona às mil maravilhas para dados de entrada quaisquer:

address = 'Four score and seven years ago...'

result = index_words(address)

print(result[:3])

>>>

[0, 5, 11]

Porém, há dois problemas na implementação da função index_words.

O primeiro é a densidade e “sujeira” do código. Cada vez que um novo resultado

é encontrado, o método append é chamado. O elemento principal da chamada do

método (result.append) não dá a devida ênfase ao valor que está sendo

adicionado à lista (index + 1). Há uma linha para criar o resultado e outra para

retorná-lo. Enquanto o corpo da função contém mais ou menos 130 caracteres

(sem contar os espaços), apenas 75 deles são realmente importantes.

Uma maneira muito melhor de implementar essa função emprega o conceito de

geradores. Os geradores são funções que usam expressões yield. Ao serem

chamadas, as funções geradores não são, de verdade, executadas. Em vez disso,

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!