<?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"

			>

	<channel>

		<title>LWS Academy &#187; Todas las publicaciones</title>
		<atom:link href="https://locosdewallstreet.com/foros/foro/foro-de-la-leccion-funciones/feed/" rel="self" type="application/rss+xml" />
		<link>https://locosdewallstreet.com/foros/foro/foro-de-la-leccion-funciones/feed/</link>
		<description></description>
		<lastBuildDate>Sat, 10 Oct 2026 10:07:19 +0000</lastBuildDate>
		<generator>https://bbpress.org/?v=2.6.9</generator>
		<language>es</language>

		
		
					
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67931</guid>
					<title><![CDATA[Respuesta a: Decorators y funcionamiento interno de los argumentos]]></title>
					<link>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67931</link>
					<pubDate>Thu, 24 Apr 2025 18:00:03 +0000</pubDate>
					<dc:creator>Almudena Zhou Ramírez López</dc:creator>

					<description>
						<![CDATA[
						<p>Hola JP,</p>
<p>No es como tal necesario. Es más para indicar que las funcionalidades pueden ir antes o después. Por ejemplo, si quieres cronometrar lo que tarda la función, harías un time_start encima y luego calcularías la diferencia con ese time_start previo. U otro ejemplo, si quisieras hacer alguna validación o cambio a algún input que le vas a pasar a la función. Es decir, no todas las funcionalidades tienen por qué ir detrás de la función!</p>
<p>Espero habértelo aclarado mejor. De cualquier manera como tú dices, si no el viernes puedes preguntar a Rubén dudas para aclararlo mejor en directo.</p>
						]]>
					</description>

					
					
				</item>

			
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67927</guid>
					<title><![CDATA[Respuesta a: Decorators y funcionamiento interno de los argumentos]]></title>
					<link>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67927</link>
					<pubDate>Thu, 24 Apr 2025 17:02:56 +0000</pubDate>
					<dc:creator>J P</dc:creator>

					<description>
						<![CDATA[
						<p>esto lo tengo claro, gracias</p>
						]]>
					</description>

					
					
				</item>

			
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67926</guid>
					<title><![CDATA[Respuesta a: Decorators y funcionamiento interno de los argumentos]]></title>
					<link>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67926</link>
					<pubDate>Thu, 24 Apr 2025 17:02:24 +0000</pubDate>
					<dc:creator>J P</dc:creator>

					<description>
						<![CDATA[
						<p>bueno, quizas si lo puedes explicar en la clase del viernes es mas facil hablado. No veo por qué añade tambien el print de antes.</p>
<p>&nbsp;</p>
<p>Gracias por la explicacion</p>
						]]>
					</description>

					
					
				</item>

			
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/funciones-recursivas/#post-67820</guid>
					<title><![CDATA[Respuesta a: Funciones recursivas]]></title>
					<link>https://locosdewallstreet.com/foros/tema/funciones-recursivas/#post-67820</link>
					<pubDate>Thu, 24 Apr 2025 12:34:55 +0000</pubDate>
					<dc:creator>J P</dc:creator>

					<description>
						<![CDATA[
						<p>Esta entendido, gracias</p>
<p>&nbsp;</p>
<p>El ejemplo de intereses compuesto hace referencia a otro ejemplo, calculo de los  ingresos de un equipo</p>
						]]>
					</description>

					
					
				</item>

			
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67819</guid>
					<title><![CDATA[Respuesta a: Decorators y funcionamiento interno de los argumentos]]></title>
					<link>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67819</link>
					<pubDate>Thu, 24 Apr 2025 12:30:45 +0000</pubDate>
					<dc:creator>Almudena Zhou Ramírez López</dc:creator>

					<description>
						<![CDATA[
						<p>Hola JP,</p>
<p>En este caso el decorador añadiría tanto el print de antes como el de después.</p>
<p>&nbsp;</p>
<p>De envoltura no se puede prescindir si se quiere utilizar como decorador, es decir, poder hacer <code>decorador(funcion)</code> ya que es el espacio que mantiene &#8220;en memoria&#8221; esa &#8220;func&#8221;, para cada una de esas funciones por lo que comentábamos del scope.</p>
<p>&nbsp;</p>
<p>El retorno es una función. Se puede definir como saludar, para que ahora al llamar a saludar se sobreescriba con esta nueva función o por ejemplo como nuevo_saludo y así saludar sería la función original y nuevo saludo la función con ambos prints.</p>
<p>&nbsp;</p>
<p>En este ejemplo en concreto aún no se habría &#8220;decorado&#8221; la función. Para ello habría que poner encima del def saludar, el @mi_envoltura. Sin embargo, por debajo un decorador simplificadamente lo que hace es lo que vemos ahí de saludar = mi_decorador(saludar)</p>
						]]>
					</description>

					
					
				</item>

			
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67818</guid>
					<title><![CDATA[Respuesta a: Decorators y funcionamiento interno de los argumentos]]></title>
					<link>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67818</link>
					<pubDate>Thu, 24 Apr 2025 12:20:46 +0000</pubDate>
					<dc:creator>J P</dc:creator>

					<description>
						<![CDATA[
						<p>Gracias por la respuesta.</p>
<p>Entonces en este caso, la modificacion que se hace a la funcion es añadir el print &#8220;despues de ejecutar..&#8221;</p>
<p>¿ por que existe envoltura? ¿se podria prescindir de ella?</p>
<p>¿para que se asigna el retorno de mi_decorator a la variable saludar?</p>
<p>En la llamada a la funcion saludar() se esta llamando a la funcion ya decorada?</p>
<p>&nbsp;</p>
						]]>
					</description>

					
					
				</item>

			
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/funciones-recursivas/#post-67758</guid>
					<title><![CDATA[Respuesta a: Funciones recursivas]]></title>
					<link>https://locosdewallstreet.com/foros/tema/funciones-recursivas/#post-67758</link>
					<pubDate>Wed, 23 Apr 2025 21:19:11 +0000</pubDate>
					<dc:creator>Rubén Castillo Sánchez</dc:creator>

					<description>
						<![CDATA[
						<p>Hola JP,</p>
<p>La clave con la recursión (igual que con los bucles y otras estructuras de control) es ir navegando mentalmente por el flujo planteándote la decisión a tomar en cada caso.</p>
<p>Yendo al ejemplo del cálculo del factorial, sabemos que el factorial de un número (denotado &#8220;n!&#8221;) representa el resultado de multiplicar <strong>todos los números enteros desde el 1 hasta n</strong>. Por ejemplo 4! es 1·2·3·4=24.</p>
<p>Esta operación puede programarse con un bucle for sencillo mediante el siguiente código:</p>
<p>def factorial(n):<br />
result = 1<br />
for i in range(1, n + 1):<br />
result *= i<br />
return result</p>
<p>Esta función lo que hace es inicializar nuestro resultado con un valor de 1, y posteriormente iterar desde que i=1 hasta que i=n (recordemos que usamos n+1 porque el número del final no está incluido en range) multiplicando el acumulado por &#8220;i&#8221;. De esta forma, en la primera iteración multiplicamos result (que vale 1) por 1. En la segunda, result vale 1 y lo multiplicamos por 2, en la tercera, vale 2 y lo multiplicamos por tres, y así sucesivamente.</p>
<p>Ahora bien, esta misma operación se puede realizar de forma recursiva como se plantea en el video:</p>
<p>def factorial(n):<br />
if n == 0 or n == 1:<br />
return 1<br />
else:<br />
return n * factorial(n &#8211; 1)</p>
<p>Vamos a ir paso a paso sobre el código.</p>
<p>En primer lugar cuando hablamos de recursividad, siempre hay <strong>dos escenarios</strong>. Hay un escenario lo suficientemente sencillo como para poder dar una <strong>respuesta inmediata</strong> que pone fin a la recursividad. Encontrar este escenario lo primero siempre es clave para plantear correctamente la relación recursiva. En este caso, el número más sencillo para el que podemos calcular el factorial es el 1, ya que 1!=1 por la propia definición del cálculo. Se ha añadido también el caso 0!=1, que es así por convención matemática, pero podemos obviarlo por simplicidad y quedarnos sólo con que 1!=1.</p>
<p>Ahora ya tenemos nuestro caso base para el que sabemos dar una respuesta inmediata. Si llamamos a nuestra función &#8220;factorial&#8221; y vemos que n=1, inmediatamente devolver un 1 como resultado, lo que explica la primera parte de la función.</p>
<p>Ahora bien, en toda función recursiva hay una segunda parte, que es la gestión de los casos más &#8220;complejos&#8221; que no podemos responder inmediatamente. El punto clave a entender aquí es que tenemos que descomponer esta relación en una operación que <strong>se acerque más a nuestro caso base</strong> que sí sabemos responder, es decir, <strong>simplificar la operación</strong>.</p>
<p>En el caso del factorial, ya sabemos que 1! = 1, porque ya tenemos el caso base definido, pero no sabemos por ejemplo cuánto es 2! porque no se corresponde con el caso base. Ahora bien, por la definición de factorial, podemos expresar 2! en función del caso base si decimos que 2!=2·1!. Con este simple cambio, ya podemos dar una respuesta final, ya que nuestra función sabe cómo multiplicar algo por 2 y también sabe que 1!=1. Sólo tenemos que multiplicar 2 por el caso base, con lo que el resultado sería 2.</p>
<p>Ahora bien, ¿cómo hago si me piden el valor de 3!? Puedo llevar la lógica más allá y deducir que 3! = 3·2!, pero tampoco sé cuánto es 2!, por lo que puedo avanzar un paso más y decir que 3!=3·(2·1!), ya que 2!=2·1!. De nuevo hemos llegado al caso base, por lo que ahora sólo tenemos que sustituir 1! por su valor (que sabemos que es 1) e ir multiplicando hacia atrás. Esto es precisamente lo que hace la línea &#8220;n * factorial(n &#8211; 1)&#8221;, descomponiendo el factorial de n como n·(n-1)! hasta que llegamos al caso base y luego simplemente tenemos que multiplicar hacia atrás.</p>
<p>Espero que con esta explicación quede mucho más claro el concepto de recursión. El resto de aplicaciones son ejemplos de esta misma lógica con ligeras modificaciones. Si tienes cualquier duda adicional, quedamos a tu disposición.</p>
						]]>
					</description>

					
					
				</item>

			
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67757</guid>
					<title><![CDATA[Respuesta a: Decorators y funcionamiento interno de los argumentos]]></title>
					<link>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67757</link>
					<pubDate>Wed, 23 Apr 2025 21:11:00 +0000</pubDate>
					<dc:creator>Almudena Zhou Ramírez López</dc:creator>

					<description>
						<![CDATA[
						<p>Con el formato en el mensaje anterior se me perdió la indentación, pero puedes ver el ejemplo completo en el notebook de la clase de Decoradores.</p>
<p>Por otro lado, no quería que el otro mensaje se hiciera muy largo, así que te explico aquí el uso de *args.</p>
<p>*args utiliza el <strong>asterisco *</strong>, que en Python sirve para <strong>&#8220;desempaquetar&#8221; o &#8220;expandir&#8221;</strong> una tupla o lista en sus elementos individuales cuando se recibe como input. Por ejemplo, si escribes:</p>
<blockquote><p>a, *b = (1, 2, 3)</p></blockquote>
<p>Entonces a valdrá 1 y b valdrá [2, 3] (Sí, se devuelve como una lista. Esto es porque se trata como un nuevo objeto y se prefiere que sea mutable.)</p>
<p>Este mismo concepto se puede aplicar a:</p>
<ul>
<li>variables que devuelve una función</li>
<li>o como hemos visto, en *args, para desempaquetar varios elementos posicionales.</li>
</ul>
<p>Diferencia entre *args y **kwargs:</p>
<ul>
<li>*args recoge los argumentos posicionales que no hemos definido explícitamente. Son los &#8220;posicionales extra&#8221;.</li>
<li>**kwargs recoge los argumentos con nombre (clave=valor) que no se han definido previamente. Son los &#8220;nombrados extra&#8221;.</li>
</ul>
<p>El ejemplo:</p>
<p>def calcular_prestamo(*capitales, tasa=0.05, tiempo=1):<br />
&#8220;&#8221;&#8221;Calcula el interés simple para múltiples capitales.&#8221;&#8221;&#8221;<br />
intereses = [capital * tasa * tiempo for capital in capitales]<br />
return sum(intereses)</p>
<p>total_interes = calcular_prestamo(1000, 2000, 3000, 4000, tasa=0.04, tiempo=2)<br />
print(f&#8221;El interés total es: ${total_interes:.2f}&#8221;)</p>
<ul>
<li>Los valores 1000, 2000, 3000, 4000 se recogen dentro de capitales, que es *args (posicionales). Esto funciona igual que el ejemplo anterior con *b.<br />
En este caso, capitales es una tupla siempre, porque así lo define Python internamente para agrupar los argumentos posicionales extra.</li>
<li><em>tasa=0.04</em> y<em> tiempo=2</em> se recogen directamente como argumentos con nombre (es decir, usando clave=valor), ya que están definidos como parámetros con valor por defecto.</li>
</ul>
<p>Este tema también es algo denso, haces muy bien en preguntar!</p>
						]]>
					</description>

					
					
				</item>

			
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67756</guid>
					<title><![CDATA[Respuesta a: Decorators y funcionamiento interno de los argumentos]]></title>
					<link>https://locosdewallstreet.com/foros/tema/decorators-y-funcionamiento-interno-de-los-argumentos/#post-67756</link>
					<pubDate>Wed, 23 Apr 2025 20:50:53 +0000</pubDate>
					<dc:creator>Almudena Zhou Ramírez López</dc:creator>

					<description>
						<![CDATA[
						<p>Hola JP,</p>
<p>Efectivamente, el tema de los decoradores en Python es algo más avanzado. Lo importante por ahora es que entiendas el concepto general, más que saber implementarlos desde cero. En la práctica, lo más común es usar decoradores ya existentes, no crearlos.</p>
<p>Un decorador es simplemente una<strong> función que añade funcionalidad a otra función</strong>, “por encima”. Esto es posible gracias al sistema de scopes de Python (visto en la clase sobre Scope, Shadowing, Args y Kwargs).</p>
<p>Para resumir: en Python las variables existen en “capas” o niveles de funciones. Por ejemplo, si ejecutamos una función desde el código principal, tenemos dos capas: la global (fuera de la función) y la local (dentro). Python permite usar variables de una capa externa dentro de una función interna, lo que hace posible cosas como los decoradores.</p>
<p>Volviendo a los decoradores: en este caso hablamos de tres scopes:</p>
<ol>
<li>El global (fuera de todo)</li>
<li>El del decorador (función intermedia)</li>
<li>El local (la función interna que se ejecuta).</li>
</ol>
<p>El decorador aprovecha que <strong>puede usar variables definidas en el scope intermedio dentro de la función interna</strong>, en este caso la función que se le pasa de input.</p>
<p>Además, los decoradores se caracterizan por:</p>
<ul>
<li>Recibir una <strong>función como parámetro (input)</strong>, que se utiliza dentro de la función interna</li>
<li><strong>Devolver una nueva función </strong>(la interna) que hace algo extra antes, después (o ambos) de ejecutar la original.</li>
</ul>
<p>Ejemplo:</p>
<blockquote><p>def mi_decorator(func):<br />
def envoltura(*args, **kwargs):<br />
print(&#8220;Antes de ejecutar la función&#8221;)<br />
resultado = func(*args, **kwargs)<br />
print(&#8220;Después de ejecutar la función&#8221;)<br />
return resultado<br />
return envoltura</p>
<p># Aplicación manual del decorator<br />
def saludar():<br />
print(&#8220;Hola, mundo!&#8221;)</p>
<p>saludar = mi_decorator(saludar)</p>
<p>saludar()</p></blockquote>
<p>Esto imprime:</p>
<blockquote><p>Antes de ejecutar la función<br />
Hola, mundo!<br />
Después de ejecutar la función</p></blockquote>
<p>Aquí:</p>
<ol>
<li>El decorador <strong>guarda</strong> la función original <em>saludar </em>c0n</li>
<li>Luego <strong>la reemplaza por otra función </strong>(al poner saludar = mi_decorador) que, al ejecutarse, hace más cosas (imprime antes y después lo que hemos visto arriba).</li>
</ol>
<p>Como extra, en este ejemplo usamos <em>*args</em> y <em>**kwargs</em>. Esto es <strong>para que el decorador funcione con cualquier tipo de argumentos</strong>, sin importar qué parámetros tiene la función original.</p>
<p>Por ejemplo, si saludar necesitara un argumento:</p>
<blockquote><p>def saludar(nombre):<br />
print(f&#8221;Hola, {nombre}!&#8221;)</p></blockquote>
<p>Entonces es necesario que el decorador acepte *args y/o **kwargs (o el nombre en específico, pero solo valdría para esa función), si no, fallaría al llamar a la función.</p>
<p>Te animo a hacer pruebas por tu cuenta, cambiando funciones y decoradores para ver cómo reaccionan que siempre se entiende mejor!</p>
<p>Es un tema denso y complejo, pero espero habértelo aclarado un poco más.</p>
						]]>
					</description>

					
					
				</item>

			
				<item>
					<guid>https://locosdewallstreet.com/foros/tema/funciones-recursivas/#post-67753</guid>
					<title><![CDATA[Respuesta a: Funciones recursivas]]></title>
					<link>https://locosdewallstreet.com/foros/tema/funciones-recursivas/#post-67753</link>
					<pubDate>Wed, 23 Apr 2025 19:21:44 +0000</pubDate>
					<dc:creator>J P</dc:creator>

					<description>
						<![CDATA[
						<p>¿podeis explicar los ejemplos de funciones recursivas en mas detalle, linea  a linea? Es dificil de seguir</p>
						]]>
					</description>

					
					
				</item>

					
		
	</channel>
	</rss>


<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/

Almacenamiento en caché de páginas con Disk: Enhanced 
Carga diferida (feed)
Minimizado usando Disk

Served from: locosdewallstreet.com @ 2026-10-10 11:07:19 by W3 Total Cache
-->