Categoría: Unidad 5 Funciones en Programación

Funciones y Procedimientos

  • 5.6 Funciones de usuario - Crear archivo para librerías de usuario en Python

    Los algoritmos que se reutilizan y se convierten a funciones, se pueden agrupar en un archivo.py. Esto permite crear un archivo como librerías con funciones personalizadas.

    Las librerías se pueden llamar por la instrucción import y se usan individualmente por el nombre de la función().

    Ejemplo - archivo de librerías personalizadas

    Para le ejemplo se crean dos funciones sumando(a,b) e invierteletras(palabra)  en un solo archivo politoESPOL.py, en directorio de trabajo:

    # ejemplo de libreria de funciones
    def sumando(a,b):
        c = a + b
        return(c)
    
    def invierteletras(palabra):
        n = len(palabra)
        invertida = ''
        for i in range(0,n,1):
            invertida = palabra[i] + invertida
        return(invertida)
    

    Archivo de programa principal politoProgram.py  que lo va a usar en el mismo directorio de trabajo donde se encuentra el archivo politoESPOL.py,de las funciones anteriores. Esta ubicación permite realizar la llamada import politoESPOL as espol.

    # probando importar funciones
    import politoESPOL as espol
    
    # INGRESO
    a = 3
    b = 5
    palabra = 'polito'
    
    # PROCEDIMIENTO
    sumado = espol.sumando(a,b)
    alreves = espol.invierteletras(palabra)
    
    # SALIDA
    print('la suma es: ', sumado)
    print('palabra invertida: ',alreves)
    

    con lo que el resultado del algoritmo y las funciones personalizadas es:

    la suma es:  8
    palabra invertida:  otilop
    >>> 
    
  • 5.5 Funciones - librerías en Python

    Algunas librerías vienen en la instalación básica de Python, como por ejemplo:

    Revisar en el enlace: https://docs.python.org/2/library/math.html

    La librería math contiene funciones matemáticas, para usarla se la llama al inicio (import):

    import math

    para luego usarla como en los ejemplos .

    math.sqrt(4)
    math.sin(0.4)
    math.cos(0.3)
    math.tan(0.45)

    Aleatorios se pueden obtener al importar la librería random

    import random as rnd

    ejemplo de un dado se obtiene como:

    dado=int(rnd.random()*6)+1

    Otras librerías se desarrollan por diferentes comunidades y se deben incorporar a la instalación. Revisar sección Descargas

    Librerías para Arreglos: Matrices, Vectores pip install numpy

    Numpy es una librería de funciones para manejo de matrices y vectores en matemáticas y álgebra.

    https://www.numpy.org/

    import numpy as np
    np.zeros(n, dtype=int)
    np.zeros(shape=(n,n), dtype=int)
    np.arange(2, 10, dtype=np.float)
    np.linspace(1., 4., 6)
    np.sin()
    np.cos()
    np.random.random()

    Librerías para Gráficas

    de funciones en los planos cartesianos, ver sección para graficas usan las librerías matplotlib: https://matplotlib.org/

    import matplotlib.pyplot as plt

    Existen algunas versiones empaquetadas de Python que permiten disponer de las librerías científicas preinstaladas. El proceso de instalación es simplificado y se encuentra en la sección WinPython (portable)

    Ejemplos de cómo usar las librerías gráficas se dan en la Unidad 8 Gráficas básicas de funciones

  • 5.4 Funciones Recursivas - Conceptos y ejercicios resueltos

    Referencia: Rodríguez 6.0 p168

    Una función recursiva muy conocida y definida en la matemática es el factorial. El factorial tiene la característica que se puede llamar a si misma.

    5! = 5x4!
           4! = 4x3!
                  3! = 3x2!
                         2! = 2x1!
               por definición   1! = 1

    Se interpreta que para encontrar 5! requerimos la respuesta de 4!.
    Para encontrar 4! se debe calcular 3! y así sucesivamente,
    hasta llegar al valor inicial de la función que es 1!=1

    La solución se interpreta  hacia atrás,  empezando desde la respuesta conocida de 1! =1 y reemplazando los valores en las operaciones que esperaban por resolver:

    5! = 5x4! = 5x24 = 120
           4! = 4x3! = 4x6 = 24
                  3! = 3x2! = 3x2 = 6
                         2! = 2x1! = 2x1 =2
               por definición   1! = 1

    Observamos que la función recursiva tiene: valores iniciales, que se llama a si misma, y de forma matemática tiene una forma elegante de escribirse:

    n! = \begin{cases} 1 && n=1 \\ n(n-1)! && n>1\end{cases}

    Escribir la función recursiva en un algoritmo consiste en transcribir paso a paso lo descrito en forma matemática.

    # factorial en forma recursiva
    
    def factorial(n):
        if n==1:
            resultado = 1
        if n>1:
            resultado = n*factorial(n-1)
        return(resultado)
    

    una vez que se ejecuta el algoritmo para que esté disponible en memoria, se usa llamando a la función

    >>> factorial(5)
    120
    >>> factorial(1)
    1
    >>> factorial(4)
    24
    >>> 
    

    Existen otras funciones recursivas en matemáticas que se pueden fácilmente convertir a algoritmos como Fibonacci, Padovan,  incluso algunas que funcionan en parejas como Par e impar. Se muestran algunas en la sección de ejemplos.

    Observaciones de uso

    Sin embargo, hay que considerar que la recursividad se usa con precaución, pues las llamadas generan otra instancia que puede saturar la capacidad del computador.

    Matrioshka. Muñeca tradicional rusa, hueca con más muñecas en su interior.

    En el ejemplo se observa que se tienen operaciones en espera de resultados de la siguiente respuesta, cada llamada usa memoria, tiempo de cómputo como recursos.

    Por ejemplo, al intentar de obtener factorial(1000) en forma recursiva, se obtiene un error "RecursionError: maximum recursion depth exceeded in comparison".

    Los lenguajes de programación tienen como límite máximo de llamadas recursivas, para evitar saturar los recursos disponibles de memoria y tiempo computacional.


    3. Ejemplos

    2Eva2007TII_T4 Fibonacci recursiva

    Solución propuesta: s2Eva2007TII_T4 Fibonacci recursiva

    2Eva2007TI_T1 Funciones par e impar recursivas

    Solución Propuesta: s2Eva2007TI_T1 Funciones par e impar recursivas

    3Eva2004TI_T3 Multiplicar con campesino egipcio

    Solución Propuesta: s3Eva2004TI_T3 Multiplicar con campesino egipcio


    Ejercicios

    2Eva2005TI_T2 Calcular potencia recursiva

    2Eva2012TII_T1 Recursiva Multi

  • 5.3 Funciones - Ordenar una lista numérica con el Método de la burbuja (bubble sort)

    Referencia: Rodríguez 7.2.1 p224, ordenamiento de burbuja wikipedia

    Se dispone de una lista de la estatura de los estudiantes de una escuela, que para formar fila se requiere ordenar en forma ascendente.

    X = [85,75,65,80]

    La primera acción a realizar es ubicar al estudiante de menor estatura en la primera posición en la fila.

    Se puede realizar comparando la estatura X[i], i=0, con las estaturas X[j], j=1, de cada estudiante que se encuentra detrás de él.

    X = [85,75,65,80]
          i  j

    Si el estudiante estudiante j es de menor estatura, deberá ocupar la posición primera i, asegurando que al menos hasta donde se ha revisado.

    X = [75,85,65,80]  # se intercambia
          i  j

    Se debe intercambiar los valores entre las posiciones i vs j. El intercambio de posiciones lleva tres pasos:

    • primero, se aparta al estudiante de la posición i
    • segundo, se mueve al estudiante de la posición j para ocupar la posición i
    • tercero, es estudiante que se apartó, se le pide que ocupe la posición del estudiante j.

    Quedando la lista como la mostrada en el ejemplo anterior. Este paso es semejante a una burbuja que "asciende".

    if X[j]<X[i]: #intercambia i con j
        aparta = X[i]
        X[i] = X[j]
        X[j] = aparta

    Se repite el proceso entre las posiciones i vs j+1, hasta llegar al último estudiante, asegurando que al menos en la posición i, se encuentre el estudiante de menor estatura.

    X = [75,85,65,80]
          i     j
    X = [65,85,75,80] # se intercambia
          i     j
    X = [65,85,75,80] # no es necesario el intercambio
          i        j
    

    Se procede a realizar el análisis con el estudiante i+1, para todos los que se encuentren detrás de él, pues todos los anteriores tienen menor estatura.

    X = [65,85,75,80] # no es necesario el intercambio
             i  j -->
    

    Algoritmo en Python

    # Ordena ascendente, 
    # método de la burbuja, Bubble sort
    # INGRESO
    X = [75,85,65,80]
    
    # PROCEDIMIENTO
    n = len(X)
    i = 0          # primero de la lista
    while i<(n-1): # hasta penúltimo
        j = i+1    # siguiente de i
        while j<n: # hasta el último
            if X[j]<X[i]: #intercambia i con j
                aparta = X[i]
                X[i] = X[j]
                X[j] = aparta
            j = j + 1
        i = i + 1
    
    # SALIDA
    print(X)
    

    Tarea:
    Escribir el algoritmo como una función estructurada.
    Realizar el algoritmo para ordenar en forma descendente.

    Referencias: Obama recuerda aún el algoritmo de Bubble Sort. Dan Siroker (2013)

  • 5.2 Funciones - Algoritmo del mayor, menor, ¿dónde?, ¿cuánto?

    [ algoritmo ] [ función ]

    De compras en el mercado de víveres, se puede consultar en precio en varios puestos y decidir dónde comprar al final de un recorrido. Si el único factor a considerar es el precio, desde luego que compraremos en el local mas barato.

    mercado viveres 01Se obtiene la lista de precios por vendedor de 1 Kg de manzanas y se requiere determinar el local con el precio más barato y en qué posición se encuentra. Considere usar el índice local empezando en cero

    local 0 1 2 3
    precio 2.25 3.00 2.10 2.50
    precio = [2.25,3,2.10,2.50]

    Al inicio y sin mas datos, se supone que el mejor precio lo ofrece el primer vendedor.  Siendo el tamaño del vector n=4

    n = len(precio)
    donde = 0

    Sin embargo la decisión se debe tomar considerando los demás locales, por lo que se compara su precio con los demás. La comparación empieza con el siguiente en la lista.

    local = donde + 1 
    while local<n:
        if (precio[local]<precio[donde]):
            donde = local
        local = local + 1

    ¿Cuánto? es el precio menor, se obtiene al revisar el valor del vector en la posición de ¿donde?

    cuanto = precio[donde]

    Tarea: Algoritmo del mayor. ¿Qué pasaría si alguien nos pregunta dónde lo venden más caro? Analice los cambios en el algoritmo.

    [ algoritmo ] [ función ]
    ..


    Algoritmo en Python

    # algoritmo del menor
    
    # INGRESO:
    precio = [2.25,3,2.10,2.50]
    
    # PROCEDIMIENTO
    n = len(precio)
    donde = 0
    local = donde + 1 
    while local<n:
        if (precio[local]<precio[donde]):
            donde = local
        local = local + 1
    
    cuanto = precio[donde]
    
    # SALIDA
    print('El menor precio:')
    print('donde:',donde)
    print('cuanto:',cuanto)
    
    

    [ algoritmo ] [ función ]
    ..


    Función en Python

    El bloque de procedimiento  se convierte a una función denominada menor, con variable de entrada vector y variable de salida donde.

    # algoritmo del menor
    def menor_donde(vector):
        n = len(vector)
        donde = 0
        i = donde + 1 
        while i<n:
            if (vector[i]<vector[donde]):
                donde = i
            i = i + 1
        return(donde)
    
    # INGRESO:
    precio = [2.25,3,2.10,2.50]
    
    # PROCEDIMIENTO
    donde = menor_donde(precio)
    cuanto = precio[donde]
    
    # SALIDA
    print('El menor precio:')
    print('donde:',donde)
    print('cuanto:',cuanto)

    [ algoritmo ] [ función ]


    Ejercicios de mayor y menor

    1Eva_IT2003_T4 Lado mayor de un polígono

    1Eva_IIT2008_T3 Tiempos de recorrido en metrovia

    1Eva_IT2007_T3 Elección de diputados provinciales

    2Eva_IT2003_T1 Funciones promedio, mayor y menor

    3Eva_IIT2008_T3 Funciones más caro y más barato

  • 5.1 Funciones en programación - Reusar algoritmos

    Cuando un algoritmo se usa de forma frecuente, en lugar de repetir las instrucciones cada vez que se necesitan, se pueden resumir y extraer en un bloque o sección dedicada independiente del resto denominada función. funciones en programacion y diagramas de flujo

    Si cada algoritmo sigue la "estructura básica", la función es un bloque de procedimiento que se podrá reutilizar en cualquier otro problema y trabaja de forma "modular".

    El bloque o función() se identifica con un nombre, que será el nombre de la función
    y usa las variables de entrada (a) y variable de salida (z).

    En programación estructurada, al cambiarse los bloques de entrada (input) y los bloques de salida (print), las instrucciones de entrada y salida se las mantiene dentro del programa principal que hace la llamada a las funciones.

    La definición de una función en Python se escribe como:

    def funcion(entrada):
        # intrucciones
        # detalladas de la funcion
        return(respuesta)
    

    Definida la función se puede usar una o varias veces en un programa principal usando el nombre de la función junto a la variable de entrada.

    funciones en programación y diagramas de flujo

    El resultado de la función se asigna a una variable que es usada dentro del programa principal.

    resultado = funcion(entrada)

    Se pueden hacer tantas llamadas a la función como sean necesarias.

    Las funciones se pueden realizar usando variables tipo escalar (enteras, reales), vectoriales o matriciales, tipo texto o cadena de caracteres, etc.

    Las variables escalares se declaran como variables internas a la función, mientras que las variables vectoriales o matriciales tienen un alcance global.

    Referencia: Rodriguez 6.1 p155, Van Rossum p19



    Variables dentro de una función

    Las variables dentro de una función se tratan como variables de un algoritmo aparte.Por lo que los nombres de las variables internas, no afectan a las variables del algoritmo principal.

    Exceptuando el caso de Arreglos y listas que el paso es por "referencia" (o álias), pues se considera que si las matrices y vectores del problema son de gran tamaño, crear copias de cada una de ellas dentro de cada llamada a la función ocupa memoria que podría ser usada para otras tareas.


    Estructura del Algoritmo con funciones creadas por usuario

    Cuando el algoritmo tiene funciones básicas creadas por usted, y son relativamente "pequeñas", se incluyen dentro del bloque de inicio.

    # INICIO
    # Referencia del problema
    import numpy as np
    import random as np
    # funciones creadas por usuario
    def miprimerafuncion(variableentrada,otravariable):
        # algunas instrucciones
        return(respuesta)
    
    # INGRESO
    a = int(input(' un numero entero'))
    b = float(input(' un numero real'))
    
    # PROCEDIMIENTO
    respuesta =  miprimerafuncion(a,b)
    
    # SALIDA
    print('alguna respuesta: ',respuesta)
    

    Si las funciones son varias o siempre usa esas funciones las puede incluir en un archivo .py y llamarlas desde el archivo con el algoritmo principal. Detalles en el siguiente tema publicado.