Algoritmos de Programación con Python

3.6. Devolver múltiples resultados

Ahora nos piden que escribamos una función que dada una duración en segundos sin fracciones (representada por un número entero) calcule la misma duración en horas, minutos y segundos.

La especificación es sencilla:

  • La cantidad de horas es la duración informada en segundos dividida por 3600 (división entera).
  • La cantidad de minutos es el resto de la división del paso 1, dividido por 60 (división entera).
  • La cantidad de segundos es el resto de la división del paso 2.
  • Es importante notar que si la duración no se informa como un número entero, todas las operaciones que se indican más arriba carecen de sentido.

¿Cómo hacemos para devolver más de un valor? En realidad lo que se espera de esta función es que devuelva una terna de valores: si ya calculamos hs, min y seg, lo que debemos retornar es la terna (hs, min, seg):

def aHsMinSeg (x):
    """ Dada una duración en segundos sin fracciones
        (la función debe invocarse con números enteros)
        se la convierte a horas, minutos y segundos """
    hs = x / 3600
    min = (x % 3600) / 60
    seg = (x % 3600 ) % 60
    return (hs, min, seg)

Esto es lo que sucede al invocar esta función:

>>> (h, m, s) = aHsMinSeg(3661)
>>> print "Son",h,"horas",m,"minutos",s,"segundos"
Son 1 horas 1 minutos 1 segundos
>>> (h, m, s) = aHsMinSeg(3661.0) # aquí violamos la especificacion
>>> print "Son",h,"horas",m,"minutos",s,"segundos" # y esto es lo que pasa:
Son 1.0169444444444444 horas 1.0166666666666666 minutos 1.0 segundos
>>>

Nota Cuando la función debe retornar múltiples resultados se empaquetan todos juntos en una n-upla del tamaño adecuado.

Esta característica está presente en Python, Haskell, y algunos otros pocos lenguajes. En los lenguajes en los que esta característica no está presente, como C, Pascal, Java o PHP, es necesario recurrir a otras técnicas más complejas para poder obtener un comportamiento similar.

Respecto de la variable que hará referencia al resultado de la invocación, se podrá usar tanto una n-upla de variables como en el ejemplo anterior, en cuyo caso podremos nombrar en forma separada cada uno de los resultados, o bien se podrá usar una sola variable, en cuyo caso se considerará que el resultado tiene un solo nombre y la forma de una n-upla:

>>> t=aHsMinSeg(3661)
>>> print t
(1, 1, 1)
>>>

Nota Si se usa una n-upla de variables para referirse a un resultado, la cantidad de variables tiene que coincidir con la cantidad de valores que se retornan.

>>> (x,y)=aHsMinSeg(3661)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack

>>> (x,y,w,z)=aHsMinSeg(3661)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 3 values to unpack
>>>

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.