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
Es que tenia que ser Python!. Cada día uno encuentra más razones para seguir descubriendo este lenguaje… avanzamos!
Saludos.
Ya vas muy avanzado… En nada te habrás liquidado todos los artículos ya. Voy a tener que darme prisa escribiendo. 😀
No creas, a medida que aprendo cosas nuevas, trato de practicar o llevarlo a la práctica, y es ahí donde cuesta un poco, vamos poco a poco pero con paso firme…
Muchas gracias!
No sabes como me has ayudado. Muchísimas gracias.
¡Caramba, me alegro!
Saludos
Muchas gracias por el post, muy util
Me alegro de que te sea útil.
Gracias por pasarte.
Muy bueno ,excelentes tus articulos,geniales,y como me costaba creer que se trataban de tuplas busque llegar a eso de esta manera,jaja!Abrazo!
Gracias!
>>> def desguazar(dividendo, divisor):
cociente=dividendo//divisor
resto=dividendo%divisor
return cociente,resto
>>> x,y=desguazar(14,4)
>>> x
3
>>> y
2
>>> type(x)
>>> desguazar(17,3)
(5, 2)
>>> type(desguazar(12,3))
excelente explicacion GRACIAS GRACIAS GRACIAS