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.

grades = []

grades.append((95, 0.45))

# ...

total = sum(score * weight for score, weight in grades)

total_weight = sum(weight for _, weight in grades)

average_grade = total / total_weight

O problema com as tuplas comuns é que elas são posicionais. Quando

associamos mais informação a uma nota, como, por exemplo, anotações do

professor a respeito do trabalho a que aquela nota pertence, é preciso reescrever

todos os pontos do sistema que usam aquela tupla para que estejam cientes de

que agora há três itens presentes em vez de dois. No exemplo a seguir, usamos o

caractere _ (o underscore como nome de variável, uma convenção do Python

para variáveis que jamais serão usadas) para capturar a terceira entidade em uma

tupla e simplesmente ignorá-la:

grades = []

grades.append((95, 0.45, 'Great job'))

# ...

total = sum(score * weight for score, weight, _ in grades)

total_weight = sum(weight for _, weight, _ in grades)

average_grade = total / total_weight

Esse padrão de estender tuplas cada vez mais é semelhante a acrescentar

camadas progressivamente mais profundas em dicionários. Assim que perceber

que suas tuplas têm mais de dois elementos, é hora de considerar outro estilo de

implementação.

O tipo namedtuple (tupla identificada) no módulo collections faz exatamente o

que queremos: definir classes de dados minúsculas e imutáveis.

import collections

Grade = collections.namedtuple('Grade', ('score', 'weight'))

Essas classes podem ser montadas tanto com argumentos posicionais como por

palavra-chave. Os campos são acessíveis por atributos identificados. O fato de os

atributos terem um identificador torna mais fácil migrar de uma namedtuple para

uma classe mais complexa, criada por você no futuro, caso os requisitos mudem

novamente e seja necessário adicionar comportamentos aos contêineres de dados

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!