################ Mas de funciones ################ Variables Globales y Locales en Python ======================================= Las variables en Python pueden ser globales o locales, lo que significa que pueden tener alcance dentro de todo el programa o limitarse a una función específica. Es importante comprender la diferencia entre estos dos tipos de variables para evitar errores y escribir un código más claro y mantenible. Variables Globales ------------------ Las variables globales son aquellas que se definen fuera de cualquier función y están disponibles en todo el programa. Pueden ser accedidas y modificadas desde cualquier parte del código. Sin embargo, su uso excesivo puede hacer que el código sea menos legible y más propenso a errores. Por ejemplo: .. code-block:: python :linenos: global_var = 10 def una_function(): print("Desde una - Valor global:", global_var) def otra_function(): print("Desde otra - Valor global:", global_var) una_function() # Salida: Desde una - Valor global: 10 otra_function() # Salida: Desde otra - Valor global: 10 Variables Locales ------------------ Las variables locales son aquellas que se definen dentro de una función y solo son accesibles dentro de esa función. No se pueden acceder a ellas desde fuera de la función. Por ejemplo: .. code-block:: python :linenos: def some_function(): local_var = 20 print("Valor local:", local_var) some_function() # Salida: Valor local: 20 print(local_var) # Error: NameError: name 'local_var' is not defined Uso en Funciones ----------------- Es común que las variables locales se utilicen dentro de funciones para almacenar datos temporales o resultados intermedios. Por otro lado, las variables globales se utilizan para almacenar información que debe ser compartida entre múltiples partes del programa. Por ejemplo, considera esta función que suma dos números y utiliza una variable global: .. code-block:: python :linenos: global_var = 10 def sumar(num): return num + global_var resultado = sumar(5) print("Resultado:", resultado) # Salida: Resultado: 15 En este caso, la función `sumar()` utiliza la variable global `global_var` para realizar la suma. Es importante tener en cuenta que si intentas modificar una variable global dentro de una función, debes usar la palabra clave `global` para indicar que estás haciendo referencia a la variable global y no creando una nueva variable local con el mismo nombre. Por ejemplo: .. code-block:: python :linenos: global_var = 10 def modificar_global(): global global_var global_var = 20 modificar_global() print("Nueva global_var:", global_var) # Salida: Nueva global_var: 20 Funciones Recursivas en Python ============================== Las funciones recursivas son aquellas que se llaman a sí mismas durante su ejecución. Este enfoque permite resolver problemas que pueden ser divididos en casos más pequeños y más simples. En Python, las funciones recursivas son una herramienta poderosa para resolver una amplia gama de problemas. Por ejemplo, considera la siguiente función que calcula el factorial de un número: .. code-block:: python :linenos: #!/usr/bin/python3 # -*- coding: utf8 -*- def factorial(x): if x == 0 or x == 1: return 1 return x * factorial(x - 1) print(factorial(4)) Este código calcula el factorial de un número utilizando una función recursiva. El factorial de un número entero positivo `n` se define como el producto de todos los números enteros positivos menores o iguales a `n`. Para calcular `factorial(n)`, la función `factorial()` se llama repetidamente con valores decrementados de `x` hasta que `x` sea igual a 1. La ejecución de `factorial(4)` se puede visualizar de la siguiente manera: .. csv-table:: "factorial(4)"," "," "," ", " " " ","4 * factorial(3)"," "," ", " " " "," ","3 * factorial(2)"," ", " " " "," "," ","2 * factorial(1)", " " " "," "," "," ", "1" En este ejemplo, cada llamada recursiva reduce el problema original a un caso más simple. Cuando `x` alcanza el valor de 1, se alcanza el caso base y la recursión termina, devolviendo el valor 1. Es importante tener en cuenta que las funciones recursivas deben tener condiciones de terminación bien definidas para evitar que el programa entre en un bucle infinito. Además, el uso excesivo de la recursión puede resultar en un exceso de uso de la pila de llamadas y causar un desbordamiento de pila. Las funciones recursivas pueden ser una herramienta elegante para resolver ciertos problemas, pero es fundamental comprender cómo funcionan y cuándo utilizarlas de manera efectiva. Pasar Parámetros por Defecto a una Función en Python ====================================================== Los parámetros por defecto en Python permiten especificar valores predeterminados para los argumentos de una función. Estos valores se utilizan cuando la función es llamada sin proporcionar valores para esos argumentos específicos. Esto brinda flexibilidad y conveniencia en el uso de funciones al evitar la necesidad de proporcionar todos los argumentos en cada llamada. Uso ---- - Simplifica el llamado a funciones al proporcionar valores predeterminados que son comunes en la mayoría de los casos. - Permite que las funciones sean más flexibles al permitir que los argumentos sean opcionales. Ejemplo ------- .. code-block:: python :linenos: def saludar(nombre="Usuario", mensaje="Hola"): print(mensaje, nombre) # Llamada a la función sin proporcionar argumentos saludar() # Salida: Hola Usuario # Llamada a la función con un argumento saludar("Juan") # Salida: Hola Juan # Llamada a la función con ambos argumentos saludar("María", "¡Buen día!") # Salida: ¡Buen día! María En este ejemplo, la función ``saludar()`` tiene dos parámetros, ``nombre`` y ``mensaje``, ambos con valores por defecto. Cuando se llama a la función sin proporcionar argumentos, se utilizan los valores por defecto. Sin embargo, si se proporcionan argumentos al llamar a la función, estos sobrescriben los valores predeterminados. Esto proporciona flexibilidad al permitir que la función se adapte a diferentes casos de uso sin necesidad de definir múltiples versiones de la misma función. Función Lambda en Python ======================== Una función lambda en Python es una función anónima y de una sola línea. A diferencia de las funciones definidas con la palabra clave ``def``, las funciones lambda se definen utilizando la palabra clave ``lambda``, y pueden tener cualquier número de argumentos, pero solo pueden contener una expresión. Uso --- - Las funciones lambda se utilizan comúnmente para crear funciones simples y cortas sin la necesidad de definir una función completa utilizando la sintaxis regular de definición de funciones con ``def``. - Son útiles cuando necesitas una función temporal para un propósito específico, como para pasarla como argumento a otra función. Sintaxis -------- La sintaxis general de una función lambda es la siguiente: .. code-block:: python :linenos: lambda argumentos: expresión Donde ``argumentos`` son los argumentos de la función y ``expresión`` es el resultado de la función. Ejemplos -------- 1. Función lambda para sumar dos números: .. code-block:: python :linenos: suma = lambda x, y: x + y resultado = suma(3, 5) print(resultado) # Salida: 8 2. Función lambda para calcular el cuadrado de un número: .. code-block:: python :linenos: cuadrado = lambda x: x**2 resultado = cuadrado(4) print(resultado) # Salida: 16 Ejercicios de Programación para Funciones Recursivas ===================================================== 1. **Cálculo de la Suma de los Primeros N Números Naturales:** El ejercicio consiste en escribir una función recursiva para calcular la suma de los primeros N números naturales. Para resolver este problema utilizando recursión, la función debería verificar si N es igual a 0 (caso base) y devolver 0 en ese caso. Si N es mayor que 0, la función debe llamar a sí misma con N-1 y sumar N al resultado de la llamada recursiva. 2. **Cálculo de la Potencia de un Número:** El ejercicio consiste en escribir una función recursiva para calcular la potencia de un número dado elevado a un exponente entero no negativo. Para resolver este problema utilizando recursión, la función debería verificar si el exponente es igual a 0 (caso base) y devolver 1 en ese caso. Si el exponente es mayor que 0, la función debe llamar a sí misma con el mismo número de base y el exponente decrementado, multiplicando el resultado de la llamada recursiva por la base original. 3. **Cálculo de la Secuencia de Fibonacci:** El ejercicio consiste en escribir una función recursiva para calcular el término n-ésimo de la secuencia de Fibonacci. Para resolver este problema utilizando recursión, la función debería verificar si n es igual a 0 o 1 (caso base) y devolver n en esos casos. Si n es mayor que 1, la función debe llamar a sí misma con n-1 y n-2, sumar los resultados de las llamadas recursivas y devolver el resultado.