Um grupo fixo de valores
Uma tupla é como uma lista que não pode mudar depois de criada. Cria-se com vírgulas, em geral entre parênteses: ("AAPL", 184.25, 184.5). Serve para um registro pequeno cujas partes têm significado fixo, como uma cotação ou uma operação. Lê-se por índice como uma lista, mas atribuir a uma posição gera um TypeError. Uma tupla de um item precisa de vírgula no fim, (5,), pois (5) é só o número 5.
quote = ("AAPL", 184.25, 184.5)
# Reading works like a list
print(quote[0], len(quote)) # AAPL 3
# Changing does not
try:
quote[1] = 185.0
except TypeError as error:
print("tuples are fixed:", error)
# One item needs a trailing comma
print(type((5,)), type((5))) # <class 'tuple'> <class 'int'>Desempacotamento: dar um nome a cada parte
O desempacotamento atribui as partes de uma tupla (ou de qualquer sequência) a vários nomes de uma vez: symbol, bid, ask = quote. O número de nomes deve ser igual ao de itens, senão o Python gera um ValueError. Em comparação com quote[0], quote[1] e quote[2], os nomes dizem o que cada parte significa, então desempacotar costuma ser mais claro que indexar. Também dá a troca clássica sem variável temporária: a, b = b, a.
# Unpack a quote into named parts
quote = ("AAPL", 184.25, 184.5)
symbol, bid, ask = quote
print(symbol, round(ask - bid, 2)) # AAPL 0.25
# Swap two values without a temporary
bid, ask = ask, bid
print(bid, ask) # 184.5 184.25
# The count must match
try:
symbol, bid = quote
except ValueError as error:
print("wrong count:", error)Pegar o resto com *
Coloque um * antes de um nome para que ele recolha tudo o que sobrar, como uma lista: first, *rest = prices ou first, *middle, last = prices. Só é permitido um nome com estrela, e os nomes simples precisam de um item cada. Use _ para uma parte de que não precisa, por exemplo first, *_, last = prices.
# * collects what is left, as a list
prices = [184.0, 185.0, 183.2, 186.1]
first, *rest = prices
print(first, rest) # 184.0 [185.0, 183.2, 186.1]
first, *_, last = prices
print(first, last) # 184.0 186.1Desempacotamento em laços, retornos e ordenação
O desempacotamento funciona onde quer que um nome seja atribuído: em um laço for (for symbol, price in quotes), em comprehensions e no resultado de uma função que devolve vários valores com return a, b, que na verdade devolve uma só tupla. As tuplas também são comparadas item a item, primeiro com primeiro e, em caso de empate, segundo com segundo; ordenar uma lista de tuplas (price, symbol) ordena por preço e desempata pelo símbolo.
# Return several values, unpack them in the caller
def spread_and_mid(bid, ask):
return ask - bid, (bid + ask) / 2
spread, mid = spread_and_mid(184.25, 184.5)
print(spread, mid) # 0.25 184.375
# Tuples sort by the first item, then the second
quotes = [("AAPL", 184.5), ("MSFT", 410.2), ("GOOG", 171.0)]
by_price = sorted((price, symbol) for symbol, price in quotes)
print(by_price) # [(171.0, 'GOOG'), (184.5, 'AAPL'), (410.2, 'MSFT')]
for price, symbol in by_price:
print(symbol, price)(symbol, bid, ask). Use uma lista quando há muitos itens parecidos e talvez se adicionem ou removam alguns. Como uma tupla não muda, ela também serve onde uma lista não serve, por exemplo como chave de dicionário, assunto que vem em breve.(a, b, c): um grupo fixo; lê-se, não se altera.x, y = pair: desempacotar em nomes; as quantidades devem coincidir.first, *rest = items: o nome com estrela recolhe o resto como lista.
A seguir: dicionários, que buscam valores por um nome em vez de uma posição.
Lab: o que é avaliado
- Desempacotar uma cotação com
quote_stats25 pts - Pegar as duas pontas com
first_last25 pts - Classificar cotações por preço com
ranked25 pts - Encontrar a bolsa mais barata com
best_ask25 pts