Python – Capítulo 32: Funciones que devuelven varios valores

Python es un lenguaje, cuanto menos, curioso. Acostumbrado a otros lenguajes de programación, estudiar Python ha sido algo que nunca ha estado exento de artificiosas sorpresas. Estoy seguro de que muchos lo adoramos por esa originalidad, esa personalidad propia que lo hace tan especial.

Recuerdo, por ejemplo, cuando me encontré por primera vez con esta sorprendente sentencia:

x,y = y,x

Esta simple línea intercambia los valores de las variables x e y sin necesidad de recurrir a una tercera variable temporal. Reconozco que me dejó un poco descuadrado.

Verifícalo,

>>> x=1
>>> y=2
>>> x,y=y,x
>>> x
2
>>> y
1

O cuando me encontré con una función que devolvía varios valores…

Por ejemplo, diseñemos una función que tome dos argumentos y calcule el cociente y el resto de la división entera del primero entre el segundo:

>>> def desguazar(dividendo, divisor):
  cociente = dividendo//divisor
  resto = dividendo%divisor
  return cociente,resto

Observa como utilizo el operador // para el cociente de la división entera y % para el cálculo del resto.

cociente = dividendo//divisor
resto = dividendo%divisor

Hasta ahí bien, pero la línea en que devuelvo el resultado al exterior parece desafiar a toda lógica:

return cociente,resto

¿Qué es esto, una función que devuelve dos valores? ¿Cómo utilizo esto en el exterior?

Mira qué sencillo:

>>> x,y = desguazar(14,4)
>>> x
3
>>> y
2

Sorprendente.

No fue hasta que me presentaron las tuplas cuando ese misterio comenzó a desentrañarse.

Una función, propiamente hablando, sólo puede devolver un objeto, pero ese objeto puede estar compuesto de otros objetos más simples. Las listas o las tuplas son ejemplos de objetos compuestos.

¿Recuerdas cuando dijimos que la forma de definir una tupla era simplemente separar cada valor entre comas? En el artículo comentamos también que el uso de paréntesis era opcional y sólo era forzosamente exigido en caso de que la construcción se prestara a confusión.

Cuando hacemos algo como

return cociente,resto

lo que estamos haciendo, en realidad, es empaquetar las variables cociente y resto en una tupla. Quizás no habría tenido un efecto visual tan sorprendente si lo hubiéramos escrito así:

return (cociente,resto)

Es exactamente lo mismo, pero ahora resulta más evidente que se trata de una tupla.

Ahora si podemos comprender esto claramente ya:

>>> x,y = desguazar(14,4)
>>> x
3
>>> y
2

La función desguazar nos devuelve una tupla que asignamos a otra tupla, la formada por las variables x e y separadas entre comas (que ya sabes que podríamos haber rodeado entre paréntesis). Observa ahora el fenómemo contrario de desempaquetado.

Si eres un escéptico y no te crees que lo que devuelve return sea una tupla, prueba a ejecutar la función en IDLE:

>>> desguazar(17,3)
(5, 2)

Es una tupla: observa como IDLE muestra la salida de una tupla empleando paréntesis, aunque sean opcionales en su creación.

El empaquetado y desempaquetado de secuencias es sólo uno de los artificios mágicos que tiene Python, pero aún hay muchos más. ¿Te animas a descubrirlos?

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2012/04/python-capitulo-32-funciones-que-devuelven-varios-valores/


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta

Python – Capítulo 29: Tuplas

Ha llegado el momento de que hablemos de una estructura de datos muy similar a las ya conocidas listas: las tuplas.

Al igual que una lista, una tupla es una secuencia ordenada de objetos. La principal diferencia entre ambas es que la primera puede ser modificada mientras que una tupla es inmutable: una vez creada, su contenido no puede modificarse (pero sí sobreescribirse, lo que equivaldría a volver a crear una tupla con el mismo nombre). Recuerda los métodos append(), extend(), remove(), pop(), etc., que, de un modo u otro, afectaban al contenido de una lista. Estos métodos no están disponibles en las tuplas.

Piensa en una tupla como una estructura más ágil que una lista, descargada de parafernalia que no siempre es necesaria. En ocasiones pueden incluso ayudarte a escribir código menos propenso a errores, en el supuesto de que, por accidente, intentes modificar una secuencia de objetos que quieres proteger.

La forma básica de definir una tupla es facilitando una secuencia simple de objetos separados entre comas:

>>> frutas='melon', 'sandía'
>>> frutas
('melon', 'sandía')

Date cuenta que no necesitamos corchetes ni paréntesis de ningún tipo. Sin embargo, al visualizarla, nos aparece con paréntesis.

Llegamos con esto a un aspecto importante: el uso de paréntesis es opcional. Podrías haber creado la tupla encerrando los datos entre paréntesis del mismo modo:

>>> frutas=('melon', 'sandía')
>>> frutas
('melon', 'sandía')

Recuerda que las listas, por el contrario, van encerradas entre corchetes.

Los paréntesis no son necesarios, pero hay ocasiones en las que su uso es obligatorio cuando su falta provoca situaciones ambiguas. Por ejemplo, observa la llamada a esta función:

funcioncilla(1,2,3)

¿Es una función con tres argumentos enteros o uno sólo en forma de tupla? La respuesta es, obviamente, la primera. Si hubiera querido que el argumento fuera una tupla debería haberlo indicado entre paréntesis para solucionar la ambigüedad:

funcioncilla((1,2,3))

Python te ofrece flexibilidad a la hora de representar una tupla. Hay programadores que sólo utilizan los paréntesis cuando no queda más remedio; otros, en cambio, los indican siempre. Hay también un término medio que emplea una notación mixta en función de su propio estilo. Elige el que mejor te plazca.

Al igual que una lista, una tupla puede contener una mezcla de objetos de distintos tipos:

>>> cajon='lunes',5,[2,3]
>>> cajon
('lunes', 5, [2, 3])

El primer elemento es una cadena de caracteres, el segundo un entero y el tercero una lista.

Puedes consultar los elementos de una tupla accediendo a través de su índice:

>>> cajon[1]
5

Recuerda que el primer elemento tiene por índice cero, como en las listas.

Pero observa qué sucede si tratas de modificar la tupla:

>>> cajon[1]=7
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    cajon[1]=7
TypeError: 'tuple' object does not support item assignment 

Sencillamente, no te deja.

Debes saber algo más a la hora de crear tuplas. Para crear una tupla vacía, sin elementos, abrimos y cerramos paréntesis sin más:

>>> vacia=()
>>> vacia
()

Si no te crees que esto es una tupla, prueba con la función type() para saber de qué objeto estamos hablando:

>>> type(vacia)
<class 'tuple'>

Para crear una tupla con un único elemento, debemos finalizar la enumeración con una coma:

>>> solo_uno=1,
>>> solo_uno
(1,)
>>> type(solo_uno)
<class 'tuple'>

Naturalmente, esto se podía hecho también con paréntesis:

>>> solo_uno=(1,)

Habría sido un error, si lo que pretendíamos era generar una tupla, escribir lo siguiente:

>>> solo_uno=(1)
>>> type(solo_uno)
<class 'int'>

Date cuenta de que type() nos está devolviendo un entero en vez de una tupla.

En resumidas cuentas, a no ser que crees una tupla vacía, asegúrate de que, al menos, exista una coma, emplees o no paréntesis.

Muchas veces se dice de las tuplas que no disponen de métodos, al ser inmutables. Esto no es cierto: no existen métodos para tuplas que modifiquen su contenido, pero sí otros que no las alteren. Por ejemplo:

>>> cajon.count('lunes')
1

El método count() nos devuelve cuántos elementos existen con una valor determinado.

O también:

>>> cajon.index('lunes')
0

El método index() nos devuelve el índice de la primera ocurriencia que haya del valor buscado.

Al igual que las listas, las tuplas pueden ser troceadas:

>>> cajon[1:]
(5, [2, 3])

Esta instrucción ha generado una nueva tupla tomando los elementos que tienen por índice 1 y sucesivos de la tupla cajon.

Existen muchos usos curiosos de las tuplas que quedan camuflados por el hecho de que pueden aparecer sin paréntesis. Iremos conociéndolos, paciencia…

Javier Montero Gabarró


Python – Capítulo 29: Tuplas


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies