5.1.3 Funciones – Archivos de librerias

Los algoritmos que se reutilizan y se convierten a funciones, se pueden agrupar en un archivo.py

Esto permite realizar un archivo de librerias de funciones personalizadas.

Las librerias se pueden llamar por la instrucción import y se usan individualmente por el nombre de la función.

Ejemplo

Archivo de funciones personalizadas 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 en el mismo directorio que el archivo de funciones.

# 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)

Resultado del algoritmo

la suma es:  8
palabra invertida:  otilop
>>> 

5.3 Funciones Recursivas

Referencia: Rodriguez 6.0 p168

Una función recursiva conocida, 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 atras,  empezando desde la respuesta conocida de 1! =1 y reemplazando los valores en las operaciones que estaban por resolverse:

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

Sín embargo hay que considerar que la recursión 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.


Ejemplos

2Eva_IIT2007_T4 Fibonacci recursiva

Solución propueta: Sol_py

2Eva_IT2007_T1 Funciones par e impar recursivas

Solución Propuesta: Sol_py

3Eva_IT2004_T3 Multiplicar con campesino egipcio

Solución Propuesta: Sol_py


Ejercicios

2Eva_IT2005_T2 Calcular potencia recursiva

2Eva_IIT2012_T1 Recursiva Multi

5.1.2 Funciones – Ejercicios

Funciones Numéricas

2Eva_IT2014_T2 Función color RGB a gris

2Eva_IIT2011_T1 Algoritmo de Euclides MCD

2Eva_IIT2013_T3 Encriptar binarios con XOR

2Eva_IT2003_T1 Funciones promedio, mayor y menor

2daEva_IIT2004_T3 Reciclar vasos


Funciones con cadenas de caracteres

2Eva_IIT2009_T1 Mensaje a SMS

2Eva_IIT2014_T3 Palabras monovocalicas en frase

2Eva_IIT2015_T1 función lipovocal(frase)

2Eva_IT2006_T3 Encriptar a Morse

2Eva_IT2009_T1 Desordenar una palabra

2Eva_IT2014_T1 Palabras con eco

5.2 Funciones – Matrices con arreglos

Ejemplos

2Eva_IIT2008_T3 Crear un Calendario

Solución propuesta: Sol_py

2Eva_IIT2003_T2 Mostrar un triángulo de Pascal

Solución propuesta: Sol_py

3Eva_IT2003_T1 Raíces enteras positivas del polinomio

Solución propuesta: Sol_py


Ejercicios

2Eva_IT2014_T3 Imagen RGB a gris

Nota:  requiere el tema 2 sobre funciones.

2Eva_IT2013_T2 Una Tabla de Bingo

2Eva_IT2012_T3 Consumo de tinta y negativo de foto

2Eva_IIT2011_T2 Ubicar ficha en tablero

5.4 Funciones – librerias

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

ejemplo de un dado se obtiene como:

dado=int(random.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

Numpy es una librería de funciones para manejo de matrices y vectores (álgebra). http://www.numpy.org/

numpy.zeros(n, dtype=int)
numpy.zeros(shape=(n,n), dtype=int)
numpy.arange(2, 10, dtype=np.float)
numpy.linspace(1., 4., 6)
numpy.sin()
numpy.cos()
numpy.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.1 Función – Reusar algoritmos

Cuando un algoritmo es usado de forma frecuente, en lugar de repetir las instrucciones cada vez que se necesitan, se pueden resumir y extraer en un bloque dedicado.

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

El bloque se identifica con un 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 llama 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.

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.