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.

raise TypeError('Must supply a container')

total = sum(numbers)

result = []

for value in numbers:

percent = 100 * value / total

result.append(percent)

return result

Essa solução evita ter que copiar o iterador de entrada por completo, como

fizemos em normalize_copy, mas também precisamos iterar sobre os dados de

entrada mais de uma vez. Essa função comporta-se como esperado para list e

ReadVisits na entrada porque eles são contêineres. Funcionaria para qualquer

tipo de contêiner que seguisse o protocolo de iteração.

visits = [15, 35, 80]

normalize_defensive(visits) # Nenhum erro aqui!

visits = ReadVisits(path)

normalize_defensive(visits) # Nenhum erro aqui!

A função gera uma exceção caso a entrada seja iterável, mas não seja um

contêiner.

it = iter(visits)

normalize_defensive(it)

>>>

TypeError: Must supply a container

Lembre-se

• Tome cuidado com funções que façam iteração sobre argumentos de entrada

mais de uma vez. Se esses argumentos forem, eles mesmos, iteradores

também, é possível que o comportamento do código não seja o esperado, ou

que alguns valores não sejam produzidos.

• O protocolo de iteração do Python define como os iteradores e contêineres

conversam com as funções nativas iter e next, laços for e expressões afins.

• Podemos facilmente definir nosso próprio contêiner iterável implementando

o método __iter__ como um gerador.

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!