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.

  1. Proponer una representación con tuplas para las cartas de la baraja francesa.
  2. 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.

  1. Proponer una representación con tuplas para representar el tiempo.
  2. 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.


Copyright (c) 2011-2014 Rosita Wachenchauzer, Margarita Manterola, Maximiliano Curia, Marcos Medrano, Nicolás Paez. La copia y redistribución de esta página se permite bajo los términos de la licencia Creative Commons Atribución - Compartir Obras Derivadas Igual 3.0 siempre que se conserve esta nota de copyright.