Fundamentos

Tutorial Fundamentos: Definición y utilidad de las funciones

Descubre cómo las funciones facilitan modularidad y reutilización del código en PseInt y Python. Mejora tu eficiencia y mantenibilidad.

Aprende Fundamentos GRATIS y certifícate

Concepto de función: modularidad y reutilización de código

Las funciones son bloques de código que realizan una tarea específica y pueden ser invocados desde diferentes partes de un programa. Permiten modularizar el código, es decir, dividir un problema grande en subproblemas más manejables, facilitando así su comprensión y desarrollo.

Al utilizar funciones, fomentamos la reutilización de código. Si una operación se repite en varias partes del programa, podemos definirla una sola vez dentro de una función y luego llamarla cuando sea necesario. Esto no solo reduce la cantidad de código escrito, sino que también minimiza los errores y facilita el mantenimiento.

En PseInt, una función se puede definir de la siguiente manera:

Funcion celsius <- ConvertirACelsius(gradosFahrenheit)
    celsius = (gradosFahrenheit - 32) * 5 / 9
Fin Funcion

Para utilizar esta función en un programa:

Algoritmo ConversionTemperatura
    // Declaración de variables
    Definir gradosF, gradosC Como Real
    
    // Solicitar al usuario la temperatura en Fahrenheit
    Escribir "Ingrese la temperatura en grados Fahrenheit:"
    Leer gradosF
    
    // Convertir a Celsius utilizando la función definida
    gradosC <- ConvertirACelsius(gradosF)
    
    // Mostrar el resultado
    Escribir "La temperatura en Celsius es: ", gradosC
Fin Algoritmo

El código equivalente en Python sería:

def convertir_a_celsius(grados_fahrenheit):
    celsius = (grados_fahrenheit - 32) * 5 / 9
    return celsius

grados_f = float(input("Ingrese la temperatura en grados Fahrenheit: "))
grados_c = convertir_a_celsius(grados_f)
print("La temperatura en Celsius es:", grados_c)

La modularidad proporcionada por las funciones también mejora la legibilidad del código. Al aislar funcionalidad específica en funciones nombradas descriptivamente, el flujo del programa principal se vuelve más claro y fácil de seguir.

Además, las funciones permiten implementar la abstracción, ocultando los detalles de implementación y mostrando solo una interfaz simple para su uso. Quienes utilicen la función no necesitan saber cómo está implementada internamente, solo cómo invocarla y qué parámetros requiere.

Por ejemplo, si desarrollamos una función para calcular el factorial de un número:

Funcion factoriales <- CalcularFactorial(numero)
    Definir i Como Entero
    Definir factoriales Como Real
    factoriales <- 1
    Para i = 1 Hasta numero Hacer
        factoriales <- factoriales * i
    Fin Para
    // Asignar el resultado al nombre de la función
    factoriales <- factoriales
Fin Funcion

En el programa principal, podemos utilizar esta función sin preocuparnos por los detalles del cálculo:

Algoritmo Factorial
    // Declaración de variables
    Definir n Como Entero
    Definir resultado Como Real
    
    // Solicitar al usuario un número entero positivo
    Escribir "Ingrese un número entero positivo (máximo 170):"
    Leer n
    
    // Validar que el número sea positivo y no exceda el límite
    Si n >= 0 Entonces
        Si n <= 170 Entonces
            // Convertir a entero si es necesario
            resultado <- CalcularFactorial(n)
            Escribir "El factorial de ", n, " es ", resultado
        Sino
            Escribir "El número es demasiado grande para calcular su factorial con precisión."
        Fin Si
    Sino
        Escribir "El número debe ser positivo."
    Fin Si
Fin Algoritmo

En Python, el equivalente sería:

def calcular_factorial(numero):
    factorial = 1
    for i in range(1, numero + 1):
        factorial *= i
    return factorial

n = int(input("Ingrese un número entero positivo: "))
if n >= 0:
    resultado = calcular_factorial(n)
    print(f"El factorial de {n} es {resultado}")
else:
    print("El número debe ser positivo.")

Las funciones también promueven la colaboración en equipos de desarrollo. Cada miembro puede trabajar en funciones específicas sin interferir con el trabajo de otros, lo que agiliza el proceso de programación.

En conclusión, comprender el concepto de función es fundamental para escribir código eficiente, mantener y escalar proyectos de manera efectiva, y aprovechar al máximo las ventajas de la programación modular.

Sintaxis básica para definir funciones en diferentes lenguajes

En PseInt, para definir una función se utiliza la siguiente sintaxis básica:

Funcion NombreFuncion(parámetros) <- NombreFuncion
    // Declaraciones y operaciones
    NombreFuncion <- valor
Fin Funcion

Donde:

  • NombreFuncion: Es el identificador único de la función.
  • Parámetros:
    • Son las entradas que recibe la función, cada una acompañada de su tipo de dato.
    • Formato: nombreParametro: TipoDato
    • Si la función no recibe parámetros, los paréntesis quedan vacíos: Funcion NombreFuncion() <- NombreFuncion
  • Asignación al Nombre de la Función:
    • Dentro del cuerpo de la función, después de realizar las operaciones necesarias, asignas el valor que deseas devolver directamente al nombre de la función.
    • Formato: NombreFuncion <- valor

Por ejemplo, una función que calcula el área de un rectángulo:

Funcion area_Rectangulo <- CalcularArea(base, altura)
    Definir area Como Real
    area <- base * altura
    // Asignar el resultado al nombre de la función para devolverlo
    area_Rectangulo <- area
Fin Funcion

En el programa principal, se puede utilizar esta función de la siguiente manera:

Algoritmo AreaRectangulo
    // Declaración de variables
    Definir b, h, resultado Como Real
    
    // Solicitar al usuario la base del rectángulo
    Escribir "Ingrese la base del rectángulo:"
    Leer b
    
    // Solicitar al usuario la altura del rectángulo
    Escribir "Ingrese la altura del rectángulo:"
    Leer h
    
    // Validar que las dimensiones sean positivas
    Si b > 0 Y h > 0 Entonces
        // Convertir a Real si es necesario (PSeInt generalmente maneja esto automáticamente)
        resultado <- CalcularArea(b, h)
        Escribir "El área del rectángulo es: ", resultado
    Sino
        Escribir "La base y la altura deben ser valores positivos."
    Fin Si
Fin Algoritmo

En Python, la sintaxis para definir una función es:

def calcular_area(base, altura):
    area = base * altura
    return area

b = float(input("Ingrese la base del rectángulo: "))
h = float(input("Ingrese la altura del rectángulo: "))
resultado = calcular_area(b, h)
print("El área del rectángulo es:", resultado)

Es importante destacar que en Python no es necesario especificar los tipos de datos en los parámetros, debido a su tipado dinámico. Sin embargo, en PseInt, es fundamental indicar el tipo para cada parámetro y para el valor de retorno.

Para funciones que no devuelven un valor (procedimientos), en PseInt se utiliza SubAlgoritmo en lugar de Funcion:

Funcion Mostrar_Saludo <- Mostrar_Saludo(nombre)
    Definir saludo1 Como Cadena
    saludo1 <- "¡Hola, " + nombre + "!"
    // Asignar el mensaje al nombre de la función
    MostrarSaludo <- saludo1
    Escribir MostrarSaludo
Fin Funcion

Y su llamado en el programa principal:

Algoritmo Saludo
    // Declaración de variables
    Definir usuario Como Cadena
    
    // Solicitar al usuario su nombre
    Escribir "Ingrese su nombre:"
    Leer usuario
    
    // Llamar a la función Mostrar_Saludo
    Escribir Mostrar_Saludo(usuario)
Fin Algoritmo

El equivalente en Python sería:

def mostrar_saludo(nombre):
    print(f"¡Hola, {nombre}!")

usuario = input("Ingrese su nombre: ")
mostrar_saludo(usuario)

Las funciones pueden también llamar a otras funciones, permitiendo construir programas más modulares. Por ejemplo:

Funcion CalcularHipotenusa <- Calcular_Hipotenusa(catetoA, catetoB)
    Definir c Como Real
    c <- Raiz(catetoA^2 + catetoB^2)
    // Asignar el resultado al nombre de la función para devolverlo
    CalcularHipotenusa <- c
Fin Funcion

Y su uso:

Algoritmo Hipotenusa
    Escribir "Ingrese el cateto a:"
    Leer catetoA
    Escribir "Ingrese el cateto b:"
    Leer catetoB
    hipotenusa1 = Calcular_Hipotenusa(catetoA, catetoB)
    Escribir "La hipotenusa es: ", hipotenusa1
FinAlgoritmo

En Python:

import math

def calcular_hipotenusa(a, b):
    c = math.sqrt(a**2 + b**2)
    return c

cateto_a = float(input("Ingrese el cateto a: "))
cateto_b = float(input("Ingrese el cateto b: "))
hipotenusa = calcular_hipotenusa(cateto_a, cateto_b)
print("La hipotenusa es:", hipotenusa)

En estas definiciones, observamos que:

  • En PseInt, las operaciones matemáticas y funciones predefinidas como Raiz se usan directamente.
  • En Python, es necesario importar módulos como math para utilizar funciones matemáticas avanzadas.

Al definir funciones, es esencial nombrarlas de manera que reflejen claramente su propósito. Esto mejora la legibilidad y facilita el mantenimiento del código. Además, es recomendable documentar brevemente lo que hace cada función.

La sintaxis básica para definir funciones en PseInt y Python difiere en detalles, pero el concepto subyacente es el mismo: encapsular lógica reutilizable que puede ser invocada desde distintas partes del programa. Comprender estas diferencias y similitudes es clave para transicionar del pseudocódigo a un lenguaje de programación real.

Ámbito de variables dentro de las funciones (local vs. global)

En la programación, el ámbito de las variables determina dónde una variable es accesible en el código. Comprender el ámbito es esencial para evitar errores y desarrollar programas eficientes. Las variables pueden ser locales o globales, y su clasificación depende de dónde y cómo se declaran.

Una variable local es aquella que se declara dentro de una función y solo es accesible dentro de esa función. Al finalizar la ejecución de la función, las variables locales se destruyen y su espacio en memoria se libera. Esto permite que diferentes funciones puedan usar nombres de variables iguales sin interferir entre sí.

Funcion Calcular_Cuadrado <- CalcularCuadrado(numero)
    Definir cuadrado1 Como Real
    cuadrado1 <- numero * numero
    // Asignar el resultado al nombre de la función para devolverlo
    Calcular_Cuadrado <- cuadrado1
Fin Funcion


Algoritmo UsoDeVariablesLocales
    // Declaración de variables
    Definir n, resultado Como Real
    
    // Solicitar al usuario un número
    Escribir "Ingrese un número:"
    Leer n
    
    // Calcular el cuadrado utilizando la función definida
    resultado <- CalcularCuadrado(n)
    
    Escribir "El cuadrado de ", n, " es ", resultado
Fin Algoritmo

El equivalente en Python:

# Ejemplo de variable local en una función
def calcular_cuadrado(numero):
    cuadrado = numero * numero  # 'cuadrado' es una variable local
    return cuadrado

print("Ingrese un número:")
n = float(input())
resultado = calcular_cuadrado(n)
print(f"El cuadrado de {n} es {resultado}")

Por otro lado, una variable global se declara fuera de cualquier función y es accesible desde cualquier parte del programa, incluyendo dentro de las funciones. Sin embargo, es importante tener cuidado al usar variables globales, ya que pueden provocar efectos secundarios indeseados si se modifican desde diferentes lugares del código. En Python:

# Declaración de una variable global
contador = 0

def incrementar_contador():
    global contador
    contador += 1  # Modifica la variable global 'contador'

incrementar_contador()
print(f"El contador es {contador}")

En el ejemplo anterior, la función IncrementarContador modifica la variable global contador. En Python, para modificar una variable global dentro de una función, es necesario declararla como global dentro de la función. De lo contrario, Python tratará contador como una variable local y generará un error si intentamos asignarle un valor.

Es una buena práctica minimizar el uso de variables globales en favor de variables locales. Las variables locales reducen las dependencias entre diferentes partes del código y facilitan el mantenimiento. Además, las funciones con variables locales son más seguras y predecibles, ya que su comportamiento depende únicamente de sus parámetros de entrada y no de variables externas.

Veamos un ejemplo donde las variables locales y globales pueden entrar en conflicto. En Python:

# Variable global 'resultado'
resultado = 0

def sumar(a, b):
    global resultado
    resultado = a + b  # Modifica la variable global 'resultado'

sumar(5, 7)
print(f"El resultado de la suma es {resultado}")

Si en lugar de usar una variable global, utilizamos una variable local y hacemos que la función retorne el resultado, obtenemos un código más limpio y seguro. En Python:

# Sin usar variables globales
def sumar(a, b):
    suma = a + b  # 'suma' es una variable local
    return suma

resultado = sumar(5, 7)
print(f"El resultado de la suma es {resultado}")

Las variables definidas dentro de una función no son accesibles desde fuera de ella. Intentar acceder a una variable local desde el programa principal o desde otra función generará un error. Esto ayuda a encapsular los datos y prevenir que distintas partes del programa afecten variables que no les corresponden.

Además, es posible tener variables locales y globales con el mismo nombre. En ese caso, dentro de una función, la variable local ocultará a la variable global. Veamos un ejemplo en Python:

# Variable global 'x'
x = 5

def mostrar_valores():
    x = 10  # 'x' es una variable local que oculta a la global
    print(f"Dentro de la función, x = {x}")

mostrar_valores()
print(f"Fuera de la función, x = {x}")

En este caso, al imprimir el valor de x fuera de la función, observamos que permanece igual, demostrando que la variable local no afecta a la global. Esto puede ser fuente de confusión, por lo que se recomienda evitar usar el mismo nombre para variables locales y globales, contribuyendo así a la claridad del código.

Comprender el ámbito de las variables es esencial para controlar el flujo de datos en un programa. Al utilizar variables locales, limitamos su uso al contexto donde son relevantes, evitando efectos inesperados en otras partes del código. Las variables globales deben manejarse con cuidado y solo usarse cuando sea realmente necesario.

Ventajas de la programación modular: mantenimiento y escalabilidad

La programación modular es una metodología que divide un programa en componentes independientes llamados módulos o funciones. Esta técnica ofrece numerosas ventajas en términos de mantenimiento y escalabilidad, aspectos cruciales en el desarrollo de software.

Al organizar el código en funciones autónomas, se facilita el mantenimiento porque cada módulo puede desarrollarse, probarse y depurarse de manera aislada. Si surge un error, es más sencillo localizar y corregir el problema sin afectar al resto del programa. Esto reduce significativamente el tiempo y esfuerzo requerido para mantener aplicaciones de gran envergadura.

Por ejemplo, consideremos una función que verifica si un número es primo. En Python sería:

def es_primo(numero):
    if numero <= 1:
        return False
    for i in range(2, numero):
        if numero % i == 0:
            return False
    return True

n = int(input("Ingrese un número entero: "))
if es_primo(n):
    print(f"{n} es un número primo.")
else:
    print(f"{n} no es un número primo.")

La modularidad también mejora la escalabilidad del software. Al desarrollar proyectos más grandes y complejos, la división en módulos permite extender el programa agregando nuevas funciones sin alterar significativamente el código existente. Los módulos pueden reutilizarse en diferentes partes del programa o incluso en otros proyectos, promoviendo la reutilización de código y reduciendo redundancias.

Además, la programación modular facilita el trabajo en equipo. Al dividir el proyecto en funciones bien definidas, varios desarrolladores pueden trabajar en paralelo en distintos módulos sin interferir entre sí. Esto mejora la eficiencia y reduce los conflictos al integrar el código.

La modularidad también favorece la legibilidad y el entendimiento del código. Al asignar responsabilidades específicas a cada función, el programa se vuelve más claro y fácil de seguir. Los nombres descriptivos de las funciones ayudan a los desarrolladores a comprender rápidamente qué hace cada parte del código.

Por ejemplo, en un sistema de gestión de ventas en Python sería:

def calcular_total(detalles):
    total = 0
    for precio in detalles:
        total += precio
    return total

def aplicar_descuento(total, porcentaje):
    descuento = total * (porcentaje / 100)
    total_descontado = total - descuento
    return total_descontado

precios = []
print("Ingrese los precios de los productos:")
for _ in range(3):
    precio = float(input())
    precios.append(precio)
total = calcular_total(precios)
total_con_descuento = aplicar_descuento(total, 10)
print("El total con descuento es:", total_con_descuento)

Gracias a la modularidad, si en el futuro necesitamos cambiar la forma de calcular el descuento, solo será necesario modificar la función AplicarDescuento, sin afectar al resto del programa. Esto demuestra cómo la programación modular facilita el mantenimiento y la evolución del software.

Otra ventaja importante es la posibilidad de realizar pruebas unitarias. Al tener funciones separadas, podemos probar cada una de manera individual para asegurarnos de que funcionan correctamente. Esto aumenta la confiabilidad del sistema y simplifica la detección de errores.

Además, la modularidad promueve la abstracción, permitiendo a los desarrolladores centrarse en el qué hace una función en lugar del cómo lo hace. Esto simplifica la complejidad y permite construir sistemas más elaborados a partir de componentes más simples.

La programación modular es esencial para desarrollar software mantenible y escalable. Al dividir el código en funciones bien definidas, se mejora la legibilidad, se facilita el mantenimiento y se permite que el software crezca de manera ordenada y eficiente.

Para seguir leyendo hazte Plus

¿Ya eres Plus? Accede a la app

Plan mensual

19.00 € /mes

Precio normal mensual: 19 €
47 % DE DESCUENTO

Plan anual

10.00 € /mes

Ahorras 108 € al año
Precio normal anual: 120 €
Aprende Fundamentos GRATIS online

Todas las lecciones de Fundamentos

Accede a todas las lecciones de Fundamentos y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Fundamentos y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Definir funciones en PseInt y Python.
  • Comprender los conceptos de modularidad y reutilización de código.
  • Diferenciar entre variables locales y globales.
  • Aplicar la abstracción para mejorar la legibilidad.
  • Evaluar ventajas de la programación modular en mantenimiento y escalabilidad.