Un grupo fijo de valores
Una tupla es como una lista que no puede cambiar tras crearse. Se crea con comas, normalmente entre paréntesis: ("AAPL", 184.25, 184.5). Sirve para un registro pequeño cuyas partes tienen un significado fijo, como una cotización o una operación. Se lee por índice como una lista, pero asignar a una posición lanza un TypeError. Una tupla de un elemento necesita una coma final, (5,), porque (5) es solo el 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'>Desempaquetado: dar nombre a cada parte
El desempaquetado asigna las partes de una tupla (o de cualquier secuencia) a varios nombres a la vez: symbol, bid, ask = quote. El número de nombres debe coincidir con el de elementos; si no, Python lanza un ValueError. Frente a quote[0], quote[1] y quote[2], los nombres dicen qué significa cada parte, por lo que desempaquetar suele ser más claro que indexar. También da el intercambio clásico sin variable temporal: 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)Quedarse con el resto con *
Pon un * delante de un nombre para que recoja todo lo que sobra, como una lista: first, *rest = prices o first, *middle, last = prices. Solo se permite un nombre con estrella, y los nombres simples necesitan un elemento cada uno. Usa _ para una parte que no necesitas, por ejemplo 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.1Desempaquetado en bucles, retornos y ordenación
El desempaquetado funciona en cualquier lugar donde se asigna un nombre: en un bucle for (for symbol, price in quotes), en comprensiones y sobre el resultado de una función que devuelve varios valores con return a, b, que en realidad devuelve una sola tupla. Las tuplas también se comparan elemento a elemento, primero con primero y, si empatan, segundo con segundo, así que ordenar una lista de tuplas (price, symbol) ordena por precio y desempata por 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). Usa una lista cuando tienes muchos elementos parecidos y puedes añadir o quitar algunos. Como una tupla no puede cambiar, también sirve donde una lista no puede, por ejemplo como clave de un diccionario, que viene pronto.(a, b, c): un grupo fijo; se lee, no se modifica.x, y = pair: desempaquetar en nombres; las cantidades deben coincidir.first, *rest = items: el nombre con estrella recoge el resto como lista.
A continuación: diccionarios, que buscan valores por un nombre en lugar de por una posición.
Lab: qué se califica
- Desempaquetar una cotización con
quote_stats25 pts - Tomar ambos extremos con
first_last25 pts - Clasificar cotizaciones por precio con
ranked25 pts - Encontrar el mercado más barato con
best_ask25 pts