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.

max_letters = count

Há dois problemas em se usar a função nativa zip.

O primeiro é que no Python 2 o zip não é um gerador. Em vez disso, vai varrer

os iteradores fornecidos até o fim e devolver uma lista com todas as tuplas

criadas. Esse comportamento pode potencialmente usar uma grande porção da

memória e causar uma falha grave, interrompendo o programa. Para usar o zip

em iteradores muito grandes no Python 2, o melhor é empregar o izip, disponível

no módulo nativo itertools (consulte o Item 46: “Use algoritmos e estruturas de

dados nativos”).

O segundo problema é que o comportamento do zip é errático se os iteradores de

entrada têm tamanhos diferentes. Por exemplo, se adicionar mais um nome na

lista anterior mas esquecer de atualizar a contagem de caracteres. Rodar zip nas

duas listas de entrada trará resultados inesperados.

names.append('Rosalind')

for name, count in zip(names, letters):

print(name)

>>>

Cecilia

Lise

Marie

O novo item 'Rosalind' não aparece. É uma característica de como o zip

funciona, gerando tuplas até que um dos iteradores chegue ao fim da sequência.

Essa técnica funciona quando se sabe que os iteradores sempre terão o mesmo

tamanho, o que quase sempre é o caso para listas derivadas criadas por

abrangência. Em muitos outros casos, o comportamento truncador de zip é

surpreendente e ruim. Se não houver possibilidade de garantir que as listas

entregues ao zip sejam de igual tamanho, considere usar a função zip_longest do

módulo nativo itertools (também chamado de izip_longest no Python 2).

Lembre-se

• A função nativa zip pode ser usada para iterar em paralelo sobre múltiplos

iteradores.

• No Python 3, zip é um gerador simplificado que produz tuplas. No Python 2,

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!