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.

>>>

[]

A causa desse comportamento bizarro é que o iterador produz seus resultados

uma única vez. Quando insistimos em iterar sobre um iterador ou gerador que já

levantou uma exceção StopIteration, não obteremos nenhum resultado na

segunda vez.

it = read_visits('/tmp/my_numbers.txt')

print(list(it))

print(list(it)) # Aqui, o iterador já está exaurido

>>>

[15, 35, 80]

[]

A confusão fica maior porque o Python não mostra nenhum erro quando

tentamos iterar sobre um iterador já exaurido. Os laços for, o construtor list e

muitas outras funções da biblioteca-padrão do Python esperam que a exceção

StopIteration seja gerada durante a operação normal. Essas funções não

conseguem distinguir entre um iterador que desde o começo não possui nada

para apresentar na saída e outro iterador que já está exaurido.

Para resolver esse problema, podemos exaurir explicitamente um iterador de

entrada e manter uma cópia completa de seu conteúdo em uma lista. Podemos

então iterar sobre a lista quantas vezes for necessário. O código a seguir mostra a

mesma função de antes, mas copia de forma preventiva o iterador de entrada:

def normalize_copy(numbers):

numbers = list(numbers) # Copia o iterador

total = sum(numbers)

result = []

for value in numbers:

percent = 100 * value / total

result.append(percent)

return result

Agora, a função devolve um resultado coerente quando lhe é fornecido um valor

de retorno de um gerador:

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!