<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Geek &#187; funciones</title>
	<atom:link href="http://mundogeek.net/etiqueta/funciones/feed/" rel="self" type="application/rss+xml" />
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Fri, 25 May 2012 14:51:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Python: Programación funcional</title>
		<link>http://mundogeek.net/archivos/2008/03/10/python-programacion-funcional/</link>
		<comments>http://mundogeek.net/archivos/2008/03/10/python-programacion-funcional/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 10:00:37 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[decoradores]]></category>
		<category><![CDATA[funcional]]></category>
		<category><![CDATA[funciones]]></category>
		<category><![CDATA[generadores]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2008/03/10/python-programacion-funcional/</guid>
		<description><![CDATA[La programación funcional es un paradigma en el que la programación se basa casi en su totalidad en funciones, entendiendo el concepto de función según su definición matemática, y no como los simples subprogramas de los lenguajes imperativos que hemos visto hasta ahora. En los lenguajes funcionales puros un programa consiste exclusivamente en la aplicación [...]]]></description>
			<content:encoded><![CDATA[<p>La programación funcional es un paradigma en el que la programación se basa casi en su totalidad en funciones, entendiendo el concepto de función según su definición matemática, y no como los simples subprogramas de los lenguajes imperativos que hemos visto hasta ahora.</p>
<p>En los lenguajes funcionales puros un programa consiste exclusivamente en la aplicación de distintas funciones a un valor de entrada para obtener un valor de salida.</p>
<p>Python, sin ser un lenguaje puramente funcional incluye varias características tomadas de los lenguajes funcionales como son las funciones de orden superior o las funciones lambda (funciones anónimas).</p>
<p><span id="more-1406"></span></p>
<h2>Funciones de orden superior</h2>
<p>El concepto de funciones de orden superior se refiere al uso de funciones como si de un valor cualquiera se tratara, posibilitando el pasar funciones como parámetros de otras funciones o devolver funciones como valor de retorno.</p>
<p>Esto es posible porque, como hemos insistido en diversas ocasiones, en Python todo son objetos. Y las funciones no son una excepción.</p>
<p>Veamos un pequeño ejemplo</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">saludar</span>(lang):
    <span class="pythonStatement">def</span> <span class="Identifier">saludar_es</span>():
        <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">Hola</span><span class="Normal">&quot;</span>

    <span class="pythonStatement">def</span> <span class="Identifier">saludar_en</span>():
        <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">Hi</span><span class="Normal">&quot;</span>

    <span class="pythonStatement">def</span> <span class="Identifier">saludar_fr</span>():
        <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">Salut</span><span class="Normal">&quot;</span>

    lang_func = {<span class="Normal">&quot;</span><span class="String">es</span><span class="Normal">&quot;</span>: saludar_es,
                 <span class="Normal">&quot;</span><span class="String">en</span><span class="Normal">&quot;</span>: saludar_en,
                 <span class="Normal">&quot;</span><span class="String">fr</span><span class="Normal">&quot;</span>: saludar_fr}
    <span class="pythonStatement">return</span> lang_func[lang]

f = saludar(<span class="Normal">&quot;</span><span class="String">es</span><span class="Normal">&quot;</span>)
f()</pre>
<p>Como podemos observar lo primero que hacemos en nuestro pequeño programa es llamar a la función <code>saludar</code> con un parámetro <code>"es"</code>. En la función saludar se definen varias funciones: <code>saludar_es</code>, <code>saludar_en</code> y <code>saludar_fr</code> y a continuación se crea un diccionario que tiene como claves cadenas de texto que identifican a cada lenguaje, y como valores las funciones. El valor de retorno de la función es una de estas funciones. La función a devolver viene determinada por el valor del parámetro lang que se pasó como argumento de <code>saludar</code>.</p>
<p>Como el valor de retorno de <code>saludar</code> es una función, como hemos visto, esto quiere decir que <code>f</code> es una variable que contiene una función. Podemos entonces llamar a la función a la que se refiere <code>f</code> de la forma en que llamaríamos a cualquier otra función, añadiendo unos paréntesis y, de forma opcional, una serie de parámetros entre los paréntesis.</p>
<p>Esto se podría acortar, ya que no es necesario almacenar la función que nos pasan como valor de retorno en una variable para poder llamarla:</p>
<p class="code">&gt;&gt;&gt; saludar(&#8220;en&#8221;)()<br />
Hi<br />
&gt;&gt;&gt; saludar(&#8220;fr&#8221;)()<br />
Salut</p>
<p>En este caso el primer par de paréntesis indica los parámetros de la función <code>saludar</code>, y el segundo par, los de la función devuelta por <code>saludar</code>.</p>
<h2>Iteraciones de orden superior sobre listas</h2>
<p>Una de las cosas más interesantes que podemos hacer con nuestras funciones de orden superior es pasarlas como argumentos de las funciones map, filter y reduce. Estas funciones nos permiten sustituir los bucles típicos de los lenguajes imperativos mediante construcciones equivalentes.</p>
<p><strong>map(function, sequence[, sequence, ...])</strong></p>
<p>La función map aplica una función a cada elemento de una secuencia y devuelve una lista con el resultado de aplicar la función a cada elemento. Si se pasan como parámetros n secuencias, la función tendrá que aceptar n argumentos. Si alguna de las secuencias es más pequeña que las demás, el valor que le llega a la función <code>function</code> para posiciones mayores que el tamaño de dicha secuencia será None.</p>
<p>A continuación podemos ver un ejemplo en el que se utiliza <code>map</code> para elevar al cuadrado todos los elementos de una lista:</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">cuadrado</span>(n):
    <span class="pythonStatement">return</span> n ** 2

l = [1, 2, 3]
l2 = map(cuadrado, l)</pre>
<p><strong>filter(function, sequence)</strong></p>
<p>La funcion filter verifica que los elementos de una secuencia cumplan una determinada condición, devolviendo una secuencia con los elementos que cumplen esa condición. Es decir, para cada elemento de <code>sequence</code> se aplica la función <code>function</code>, si el resultado es True se añade a la lista y en caso contrario se descarta.</p>
<p>A continuación podemos ver un ejemplo en el que se utiliza <code>filter</code> para conservar solo los números que son pares.</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">es_par</span>(n):
    <span class="pythonStatement">return</span> (n % 2.0 == 0)

l = [1, 2, 3]
l2 = filter(es_par, l)</pre>
<p><strong>reduce(function, sequence[, initial])</strong></p>
<p>La función reduce aplica una función a pares de elementos de una secuencia hasta dejarla en un solo valor.</p>
<p>A continuación podemos ver un ejemplo en el que se utiliza <code>reduce</code> para sumar todos los elementos de una lista.</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">sumar</span>(x, y):
    <span class="pythonStatement">return</span> x + y

l = [1, 2, 3]
l2 = reduce(sumar, l)</pre>
<h2>Funciones lambda</h2>
<p>El operador lambda sirve para crear funciones anónimas en línea. Al ser funciones anónimas, es decir, sin nombre, estas no podrán ser referenciadas más tarde.</p>
<p>Las funciones lambda se construyen mediante el operador lambda, los parámetros de la función separados por comas (atención, SIN paréntesis), dos puntos (:) y el código de la función.</p>
<p>Esta construcción podrían haber sido de utilidad en los ejemplos anteriores para reducir código. El programa que utilizamos para explicar <code>filter</code>, por ejemplo, podría expresarse así:</p>
<pre class="code">l = [1, 2, 3]
l2 = filter(<span class="pythonStatement">lambda</span> n: n % 2.0 == 0, l)</pre>
<p>Comparemoslo con la versión anterior:</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">es_par</span>(n):
    <span class="pythonStatement">return</span> (n % 2.0 == 0)

l = [1, 2, 3]
l2 = filter(es_par, l)</pre>
<p>Las funciones lambda están restringidas por la sintaxis a una sola expresión.</p>
<h2>Comprensión de listas</h2>
<p>En Python 3 map y filter se verán sustituidas por las list comprehensions o comprensión de listas, característica tomada del lenguaje de programación funcional Haskell y que está presente en Python desde la versión 2.0.</p>
<p>La comprensión de listas es una construcción que permite crear listas a partir de otras listas. Cada una de estas construcciones consta de una expresión que determina cómo modificar el elemento de la lista original, seguida de una o varias clausulas for y opcionalmente una o varias clausulas if.</p>
<p>Veamos un ejemplo de cómo se podría utilizar la comprensión de listas para elevar al cuadrado todos los elementos de una lista, como hicimos en nuestro ejemplo de <code>map</code>.</p>
<pre class="code">l2 = [n ** 2 <span class="pythonRepeat">for</span> n <span class="pythonOperator">in</span> l]</pre>
<p>Esta expresión se leería como &#8220;para cada n en l haz n ** 2&#8243;. Como vemos tenemos primero la expresión que modifica los valores de la lista original (n ** 2), después el <code>for</code>, el nombre que vamos a utilizar para referirnos al elemento actual de la lista original, el <code>in</code>, y la lista sobre la que se itera.</p>
<p>El ejemplo que utilizamos para la función filter (conservar solo los números que son pares) se podría expresar con comprensión de listas así:</p>
<pre class="code">l2 = [n <span class="pythonRepeat">for</span> n <span class="pythonOperator">in</span> l <span class="pythonConditional">if</span> n % 2.0 == 0]</pre>
<p>Veamos por último un ejemplo de compresión de listas con varias clausulas for:</p>
<pre class="code">l = [0, 1, 2, 3]
m = [<span class="Normal">&quot;</span><span class="String">a</span><span class="Normal">&quot;</span>, <span class="Normal">&quot;</span><span class="String">b</span><span class="Normal">&quot;</span>]
n = [s * v <span class="pythonRepeat">for</span> s <span class="pythonOperator">in</span> m
           <span class="pythonRepeat">for</span> v <span class="pythonOperator">in</span> l
           <span class="pythonConditional">if</span> v &gt; 0]</pre>
<p>Esta construcción sería equivalente a una serie de for-in anidados:</p>
<pre class="code">l = [0, 1, 2, 3]
m = [<span class="Normal">&quot;</span><span class="String">a</span><span class="Normal">&quot;</span>, <span class="Normal">&quot;</span><span class="String">b</span><span class="Normal">&quot;</span>]
n = []

<span class="pythonRepeat">for</span> s <span class="pythonOperator">in</span> m:
    <span class="pythonRepeat">for</span> v <span class="pythonOperator">in</span> l:
        <span class="pythonConditional">if</span> v &gt; 0:
            n.append(s* v)</pre>
<h2>Generadores</h2>
<p>Las expresiones generadoras funcionan de forma muy similar a la comprensión de listas. De hecho su sintaxis es exactamente igual, a excepción de que se utiliza paréntesis en lugar de corchetes:</p>
<pre class="code">l2 = (n ** 2 <span class="pythonRepeat">for</span> n <span class="pythonOperator">in</span> l)</pre>
<p>Sin embargo las expresiones generadoras se diferencian de la comprensión de listas en que no se devuelve una lista, sino un generador.</p>
<p class="code">&gt;&gt;&gt; l2 = [n ** 2 for n in l]<br />
&gt;&gt;&gt; l2<br />
[0, 1, 4, 9]<br />
&gt;&gt;&gt; l2 = (n ** 2 for n in l)<br />
&gt;&gt;&gt; l2<br />
&lt;generator object at 0x00E33210&gt;</p>
<p>Un generador es una clase especial de función que <em>genera</em> valores sobre los que iterar. Para devolver el siguiente valor sobre el que iterar se utiliza la palabra clave <code>yield</code>. Veamos por ejemplo un generador que devuelva números de <code>n</code> a <code>m</code> con un salto <code>s</code>.</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">mi_generador</span>(n, m, s):
    <span class="pythonRepeat">while</span>(n &lt;= m):
        <span class="pythonStatement">yield</span> n
        n += s</pre>
<p class="code">&gt;&gt;&gt; x = mi_generador(0, 5, 1)<br />
&gt;&gt;&gt; x<br />
&lt;generator object at 0x00E25710&gt;</p>
<p>El generador se puede utilizar en cualquier lugar donde se necesite un objeto iterable. Por ejemplo en un for-in:</p>
<pre class="code"><span class="pythonRepeat">for</span> n <span class="pythonOperator">in</span> mi_generador(0, 5, 1):
    <span class="pythonStatement">print</span> n</pre>
<p>Como no estamos creando una lista completa en memoria, sino generando un solo valor cada vez que se necesita, en situaciones en las que no sea necesario tener la lista completa el uso de generadores puede suponer una gran diferencia de memoria. En todo caso siempre es posible crear una lista a partir de un generador mediante la función list:</p>
<pre class="code">lista = list(mi_generador)</pre>
<h2>Decoradores</h2>
<p>Un decorador no es es mas que una función que recibe una función como parámetro y devuelve otra función como resultado. Por ejemplo podríamos querer añadir la funcionalidad de que se imprimiera el nombre de la función llamada por motivos de depuración:</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">mi_decorador</span>(funcion):
    <span class="pythonStatement">def</span> <span class="Identifier">nueva</span>(*args):
        <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">Llamada a la funcion</span><span class="Normal">&quot;</span>, funcion.__name__
        retorno = funcion(*args)
        <span class="pythonStatement">return</span> retorno
    <span class="pythonStatement">return</span> nueva</pre>
<p>Como vemos el código de la función mi_decorador no hace más que crear una nueva función y devolverla. Esta nueva función imprime el nombre de la función a la que &#8220;decoramos&#8221;, ejecuta el código de dicha función, y devuelve su valor de retorno. Es decir, que si llamáramos a la función <code>nueva</code> que nos devuelve <code>mi_decorador</code>, el resultado sería el mismo que el de llamar directamente a la función que le pasamos como parámetro, exceptuando el que se imprimirá además el nombre de la función.</p>
<p>Supongamos como ejemplo una función <code>imp</code> que no hace otra cosa que mostrar en pantalla la cadena pasada como parámetro.</p>
<p class="code">&gt;&gt;&gt; imp(&#8220;hola&#8221;)<br />
hola<br />
&gt;&gt;&gt; mi_decorador(imp)(&#8220;hola&#8221;)<br />
Llamada a la función imp<br />
hola</p>
<p>Ahora bien, la sintaxis para llamar a la función que nos devuelve <code>mi_decorador</code> no es muy clara, aunque si lo estudiamos detenidamente veremos que no tiene mayor complicación. Primero se llama a la función que decora con la función a decorar: <code>mi_decorador(imp)</code>; y una vez obtenida la función ya decorada se la puede llamar pasando el mismo parámetro que se pasó anteriormente: <code>mi_decorador(imp)("hola")</code></p>
<p>Esto se podría expresar más claramente precediendo la definición de la función que queremos decorar con el signo @ seguido del nombre de la función decoradora:</p>
<pre class="code"><span class="Define">@</span><span class="Identifier">mi_decorador</span>
<span class="pythonStatement">def</span> <span class="Identifier">imp</span>(s):
    <span class="pythonStatement">print</span> s</pre>
<p>De esta forma cada vez que se llame a <code>imp</code> se estará llamando realmente a la versión decorada. Python incorpora esta sintaxis desde la versión 2.4 en adelante.</p>
<p>Si quisiéramos aplicar más de un decorador bastaría añadir una nueva línea con el nuevo decorador.</p>
<pre class="code"><span class="Define">@</span><span class="Identifier">otro_decorador</span>
<span class="Define">@</span><span class="Identifier">mi_decorador</span>
<span class="pythonStatement">def</span> <span class="Identifier">imp</span>(s):
    <span class="pythonStatement">print</span> s</pre>
<p>Es importante advertir que los decoradores se ejecutarán de abajo a arriba. Es decir, en este ejemplo primero se ejecutaría <code>mi_decorador</code> y después <code>otro_decorador</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2008/03/10/python-programacion-funcional/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Python: Funciones</title>
		<link>http://mundogeek.net/archivos/2008/03/03/python-funciones/</link>
		<comments>http://mundogeek.net/archivos/2008/03/03/python-funciones/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 10:50:02 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[funciones]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2008/03/03/python-funciones/</guid>
		<description><![CDATA[Una función es un fragmento de código con un nombre asociado que realiza una serie de tareas y devuelve un valor. A los fragmentos de código que tienen un nombre asociado y no devuelven valores se les suele llamar procedimientos. En Python no existen los procedimientos, ya que cuando el programador no especifica un valor [...]]]></description>
			<content:encoded><![CDATA[<p>Una función es un fragmento de código con un nombre asociado que realiza una serie de tareas y devuelve un valor. A los fragmentos de código que tienen un nombre asociado y no devuelven valores se les suele llamar procedimientos. En Python no existen los procedimientos, ya que cuando el programador no especifica un valor de retorno la función devuelve el valor <code>None</code>, equivalente al <code>null</code> de Java.<span id="more-1396"></span></p>
<p>Además de ayudarnos a programar y depurar dividiendo el programa en partes las funciones también permiten reutilizar código.</p>
<p>En Python las funciones se declaran de la siguiente forma:</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">mi_funcion</span>(param1, param2):
    <span class="pythonStatement">print</span> param1
    <span class="pythonStatement">print</span> param2</pre>
<p>Es decir, la palabra clave <code>def</code> seguida del nombre de la función y entre paréntesis los argumentos separados por comas. A continuación, en otra línea, indentado y después de los dos puntos tendríamos las líneas de código que conforman el código a ejecutar por la función.</p>
<p>También podemos encontrarnos con una cadena de texto como primera línea del cuerpo de la función. Estas cadenas se conocen con el nombre de docstring (cadena de documentación) y sirven, como su nombre indica, a modo de documentación de la función.</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">mi_funcion</span>(param1, param2):
    <span class="Normal">&quot;&quot;&quot;</span><span class="String">Esta funcion imprime los dos valores pasados
    como parametros</span><span class="Normal">&quot;&quot;&quot;</span>
    <span class="pythonStatement">print</span> param1
    <span class="pythonStatement">print</span> param2</pre>
<p>Al declarar la función lo único que hacemos es asociar un nombre al fragmento de código que conforma la función, de forma que podamos ejecutar dicho código más tarde referenciándolo por su nombre. Es decir, a la hora de escribir estas líneas no se ejecuta la función. Para llamar a la función (ejecutar su código) se escribiría:</p>
<pre class="code">mi_funcion(<span class="Normal">&quot;</span><span class="String">hola</span><span class="Normal">&quot;</span>, 2)</pre>
<p>Es decir, el nombre de la función seguido de los valores que queramos pasar como parámetros entre paréntesis. La asociación de los parámetros y los valores pasados a la función se hace normalmente de izquierda a derecha: como a param1 le hemos dado un valor &#8220;hola&#8221; y param2 vale 2, mi_funcion imprimiría hola en una línea, y a continuación 2.</p>
<p>Sin embargo también es posible modificar el orden de los parámetros si indicamos el nombre del parámetro al que asociar el valor a la hora de llamar a la función:</p>
<pre class="code">mi_funcion(param2 = 2, param1 = <span class="Normal">&quot;</span><span class="String">hola</span><span class="Normal">&quot;</span>)</pre>
<p>El número de valores que se pasan como parámetro al llamar a la función tiene que coincidir con el número de parámetros que la función acepta según la declaración de la función. En caso contrario Python se quejará:</p>
<p class="code">&gt;&gt;&gt; mi_funcion(&#8220;hola&#8221;)<br />
Traceback (most recent call last):<br />
File &#8220;&lt;stdin&gt;&#8221;, line 1, in &lt;module&gt;<br />
TypeError: mi_funcion() takes exactly 2 arguments (1 given)</p>
<p>También es posible no obstante definir funciones con un número variable de argumentos o bien asignar valores por defecto a los parámetros para el caso de que no se indique ningún valor para ese parámetro al llamar a la función.</p>
<p>Los valores por defecto para los parámetros se definen situando un signo igual después del nombre del parámetro y a continuación el valor por defecto:</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">imprimir</span>(texto, veces = 1):
    <span class="pythonStatement">print</span> veces * texto</pre>
<p>En el ejemplo anterior si no indicamos un valor para el segundo parámetro se imprimirá una sola vez la cadena que le pasamos como primer parámetro:</p>
<p class="code">&gt;&gt;&gt; imprimir(&#8220;hola&#8221;)<br />
hola</p>
<p>si se le indica otro valor, será este el que se utilice:</p>
<p class="code">&gt;&gt;&gt; imprimir(&#8220;hola&#8221;, 2)<br />
holahola</p>
<p>Para definir funciones con un número variable de argumentos colocamos un último parámetro para la función cuyo nombre debe precederse de un signo &#8216;*&#8217;:</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">varios</span>(param1, param2, *otros):
    <span class="pythonRepeat">for</span> val <span class="pythonOperator">in</span> otros:
        <span class="pythonStatement">print</span> otros

varios(1, 2)
varios(1, 2, 3)
varios(1, 2, 3, 4)</pre>
<p>Esta sintaxis funciona creando una tupla (de nombre <code>otros</code> en el ejemplo) en la que se almacenan los valores de todos los parámetros extra pasados como argumento. Para la primera llamada, <code>varios(1, 2)</code>, la tupla otros estaría vacía dado que no se han pasado más parámetros que los dos definidos por defecto, por lo tanto no se imprimiría nada. En la segunda llamada otros valdría <code>(3)</code>, y en la tercera <code>(3, 4)</code>.</p>
<p>También se puede preceder el nombre del último parámetro con &#8216;**&#8217;, en cuyo caso en lugar de una tupla se utilizaría un diccionario. Las claves de este diccionario serían los nombres de los parámetros indicados al llamar a la función y los valores del diccionario, los valores asociados a estos parámetros:</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">varios</span>(param1, param2, **otros):
    <span class="pythonRepeat">for</span> i <span class="pythonOperator">in</span> otros.items():
        <span class="pythonStatement">print</span> i

varios(1, 2, tercero = 3)</pre>
<p>Los que conozcáis algún otro lenguaje de programación os estaréis preguntando si en Python al pasar una variable como argumento de una función estas se pasan por referencia o por valor. En el paso por referencia lo que se pasa como argumento es una referencia o puntero a la variable, es decir, la dirección de memoria en la que se encuentra el contenido de la variable, y no el contenido en si. En el paso por valor, por el contrario, lo que se pasa como argumento es el valor que contenía la variable.</p>
<p>La diferencia entre ambos estriba en que en el paso por valor los cambios que se hagan sobre el parámetro no se ven fuera de la función, dado que los argumentos de la función son variables locales a la función que contienen los valores indicados por las variables que se pasaron como argumento. Es decir, en realidad lo que se le pasa a la función son copias de los valores y no las variables en si.</p>
<p>Si quisiéramos modificar el valor de uno de los argumentos y que estos cambios se reflejaran fuera de la función tendríamos que pasar el parámetro por referencia.</p>
<p>En C los argumentos de las funciones se pasan por valor, aunque se puede simular el paso por referencia usando punteros. En Java también se usa paso por valor, aunque para las variables que son objetos lo que se hace es pasar por valor la referencia al objeto, por lo que en realidad parece paso por referencia.</p>
<p>En Python también se utiliza el paso por valor de referencias a objetos, como en Java, aunque en el caso de Python, a diferencia de Java, todo es un objeto (para ser exactos lo que ocurre en realidad es que al objeto se le asigna otra etiqueta o nombre en el espacio de nombres local de la función).</p>
<p>Sin embargo no todos los cambios que hagamos a los parámetros dentro de una función Python se reflejarán fuera de esta, ya que hay que tener en cuenta que en Python existen objetos inmutables, como las tuplas, por lo que si intentáramos modificar una tupla pasada como parámetro lo que ocurriría en realidad es que se crearía una nueva instancia, por lo que los cambios no se verían fuera de la función.</p>
<p>Veamos un pequeño programa para demostrarlo:</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">f</span>(x, y):
    x = x + 3
    y.append(23)
    <span class="pythonStatement">print</span> x, y

x = 22
y = [22]
f(x, y)
<span class="pythonStatement">print</span> x, y</pre>
<p>El resultado de la ejecución de este programa sería</p>
<p>25 [22, 23]</p>
<p>22 [22, 23]</p>
<p>Como vemos la variable x no conserva los cambios una vez salimos de la función porque los enteros son inmutables en Python. Sin embargo la variable y si los conserva, porque las listas son mutables.</p>
<p>En resumen: los valores mutables se comportan como paso por referencia, y los inmutables como paso por valor.</p>
<p>Con esto terminamos todo lo relacionado con los parámetros de las funciones. Veamos ahora cómo devolver valores, para lo que se utiliza la palabra clave return:</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">sumar</span>(x, y):
    <span class="pythonStatement">return</span> x + y

<span class="pythonStatement">print</span> sumar(3, 2)</pre>
<p>Como vemos esta función tan sencilla no hace otra cosa que sumar los valores pasados como parámetro y devolver el resultado como valor de retorno.</p>
<p>También podríamos pasar varios valores que retornar a return.</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">f</span>(x, y):
    <span class="pythonStatement">return</span> x * 2, y * 2

a, b = f(1, 2)</pre>
<p>Sin embargo esto no quiere decir que las funciones Python puedan devolver varios valores, lo que ocurre en realidad es que Python crea una tupla al vuelo cuyos elementos son los valores a retornar, y esta única variable es la que se devuelve.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2008/03/03/python-funciones/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
	</channel>
</rss>

