En la conversión de un tiempo a horas, minutos y segundos, en la sección 3.6, usamos n-uplas (o tuplas) como una construcción que nos permitía que una función devolviera múltiples valores.
En programación, en general, al querer modelar objetos de la vida real, es muy común que querramos describir un objeto como un agrupamiento de datos de distintos tipos. Veamos algunos ejemplos:
- Una fecha la podemos querer representar como la terna día (un número entero), mes (una cadena de caracteres), y año (un número entero), y tendremos por ejemplo:
(25, "Mayo", 1810)
. - Como datos de los alumnos queremos guardar número de padrón, nombre y apellido, como por ejemplo
(89766, "Alicia", "Hacker")
. - Es posible anidar tuplas: como datos de los alumnos queremos guardar número de padrón, nombre, apellido y fecha de nacimiento, como por ejemplo:
(89766, "Alicia", "Hacker", (9, "Julio", 1988))
.
7.1.1. Elementos y segmentos de tuplas
Las tuplas son secuencias, igual que las cadenas, y se puede utilizar la misma notación de índices que en las cadenas para obtener cada una de sus componentes.
- El primer elemento de
(25, "Mayo", 1810)
es 25. - El segundo elemento de
(25, "Mayo", 1810)
es "Mayo". - El tercer elemento de
(25, "Mayo", 1810)
es 1810.
>>> t=(25, "Mayo", 1810)
>>> t[0]
25
>>> t[1]
'Mayo'
>>> t[2]
1810
Advertencia Todas las secuencias en Python comienzan a numerarse desde 0. Es por eso que se produce un error si se quiere acceder al n-ésimo elemento de un tupla:
>>> t[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
También se puede utilizar la notación de rangos, que se vio aplicada a
cadenas para obtener una nueva tupla, con un subconjunto de componentes.
Si en el ejemplo de la fecha queremos quedarnos con un par que sólo
contenga día y mes podremos tomar el rango [:2]
de la misma:
>>> t[:2]
(25, 'Mayo')
Ejercicio 7.1. ¿Cuál es el cuarto elemento de (89766, "Alicia", "Hacker", (9, "Julio", 1988))
?
7.1.2. Las tuplas son inmutables
Al igual que con las cadenas, las componentes de las tuplas no pueden ser modificadas:
>>> t[2] = 2008
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
7.1.3. Longitud de tuplas
A las tuplas también se les puede aplicar la función len()
para calcular
su longitud. El valor de esta función aplicada a una tupla nos indica
cuántas componentes tiene esa tupla.
>>> len(t)
3
Ejercicio 7.2. ¿Cuál es la longitud de (89766, "Alicia", "Hacker", (9, "Julio", 1988))
?
Una tupla vacía es una tupla con 0 componentes, y se la indica como ()
.
>>> z=()
>>> len(z)
0
>>> z[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
Una tupla unitaria es una tupla con una componente. Para distinguir
la tupla unitaria de la componente que contiene, Python exige que a la
componente no sólo se la encierre entre paréntesis sino que se le
ponga una coma a continuación del valor de la componente (así (1810)
es un número, pero (1810,)
es la tupla unitaria cuya única componente
vale 1810
).
>>> u=(1810)
>>> len(u)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
>>> u=(1810,)
>>> len(u)
1
>>> u[0]
1810
7.1.4. Empaquetado y desempaquetado de tuplas
Si a una variable se le asigna una secuencia de valores separados por comas, el valor de esa variable será la tupla formada por todos los valores asignados. A esta operación se la denomina empaquetado de tuplas.
>>> a=125
>>> b="\#"
>>> c="Ana"
>>> d=a,b,c
>>> len(d)
3
>>> d
(125, '\#', 'Ana')
>>>
Si se tiene una tupla de longitud k
, se puede asignar la tupla a k
variables distintas y en cada variable quedará una de las componentes
de la tupla. A esta operación se la denomina desempaquetado de tuplas.
>>> x,y,z = d
>>> x
125
>>> y
'\#'
>>> z
'Ana'
Advertencia Si las variables no son distintas, se pierden valores. Y si las variables son exactamente k
se produce un error.
>>> p,p,p = d
>>> p
'Ana'
>>> m,n = d
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> m,n,o,p=d
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 3 values to unpack
7.1.5. Ejercicios con tuplas
Ejercicio 7.3. Cartas como tuplas.
- Proponer una representación con tuplas para las cartas de la baraja francesa.
- Escribir una función
poker
que reciba cinco cartas de la baraja francesa e informe (devuelva el valor lógico correspondiente) si esas cartas forman o no un poker (es decir que hay 4 cartas con el mismo número).
Ejercicio 7.4. El tiempo como tuplas.
- Proponer una representación con tuplas para representar el tiempo.
- Escribir una función
sumaTiempo
que reciba dos tiempos dados y devuelva su suma.
Ejercicio 7.5. Escribir una función diaSiguienteE
que dada una
fecha expresada como la terna (Día, Mes, Año) (donde Día, Mes y Año
son números enteros) calcule el día siguiente al dado, en el mismo
formato.
Ejercicio 7.6. Escribir una función diaSiguienteT
que dada una
fecha expresada como la terna (Día, Mes, Año) (donde Día y Año son
números enteros, y Mes es el texto Ene
, Feb
, ..., Dic
, según
corresponda) calcule el día siguiente al dado, en el mismo formato.