5.4 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.3 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.


Ejercicios resueltos

2Eva_IIT2007_T4 Fibonacci recursiva

Solución propuesta: s2Eva_IIT2007_T4 Fibonacci recursiva

2Eva_IT2007_T1 Funciones par e impar recursivas

Solución Propuesta: s2Eva_IT2007_T1 Funciones par e impar recursivas

3Eva_IT2004_T3 Multiplicar con campesino egipcio

Solución Propuesta: s3Eva_IT2004_T3 Multiplicar con campesino egipcio


Ejercicios

2Eva_IT2005_T2 Calcular potencia recursiva

2Eva_IIT2012_T1 Recursiva Multi

5.2 Funciones – Matrices con arreglos, ejercicios resueltos

Ejemplos, ejercicios resueltos con funciones

2Eva_IIT2008_T3 Crear un Calendario

Solución propuesta con video: s2Eva_IIT2008_T3 Crear un Calendario

2Eva_IIT2003_T2 Mostrar un triángulo de Pascal

Solución propuesta: s2Eva_IIT2003_T2 Mostrar un triángulo de Pascal

3Eva_IT2003_T1 Raíces enteras positivas del polinomio

Solución propuesta: s3Eva_IT2003_T1 Raíces enteras positivas del polinomio

2Eva_IT2014_T3 Imagen RGB a gris

Solución propuesta: s2Eva_IT2014_T3 Imagen RGB a gris

Nota:  requiere el tema 2 sobre funciones. 2Eva_IT2014_T2 Función color RGB a gris

Solución propuesta: s2Eva_IT2014_T2 Función color RGB a gris

2Eva_IT2013_T2 Una Tabla de Bingo con arreglos

Solución propuesta: s2Eva_IT2013_T2 Una Tabla de Bingo con arreglos

Nota:  requiere el tema 1 sobre funciones: 2Eva_IT2013_T1 Función sorteoentre(k,a,b)

Solución propuesta: s2Eva_IT2013_T1 Función sorteoentre(k,a,b)

Tareas

2Eva_IT2012_T3 Consumo de tinta y negativo de foto

2Eva_IIT2011_T2 Ubicar ficha en tablero

5.1.4 Funciones – Ordenar una lista numérica con el Método de la burbuja (bubble sort)

Referencia: Rodriguez 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 detras de él, pues todos los anteriores tienen menor estatura.

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

Instrucciones 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: Realizar el algoritmo para ordenar en forma descendente.

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

5.1.3 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.1.2 Funciones – Ejercicios numéricos y cadenas en Python

Se listan algunos ejercicios sobre funciones con operaciones numéricas y otra para ser realizadas con cadenas de caracteres.

Funciones con operaciones 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


Funciones con Arreglos – matrices

3Eva_IT2010_T2 Funciones ocupados y ubica libre en matriz

3Eva_IIT2010_T1 Matriz con aleatorios no repetidos (desordena)

3Eva_IIT2015_T4 Orientar código QR (Quick Response Code)

5.1.1 Funciones – Ejercicios resueltos en Python

Ejercicios resueltos sobre Funciones() definidas por el usuario. Los ejemplos presentados, requieren que el usuario desarrolle el algoritmo como una función acorde a las estructuras de programación.

3Eva_IT2000_T1 Validar caracteres tipo numérico

Solución Propuesta: s3Eva_IT2000_T1 Validar caracteres tipo numérico

3Eva_IIIT2003_T1 Funciones lógicas pyq y poq

Solución Propuesta: s3Eva_IIIT2003_T1 Funciones lógicas pyq y poq

2Eva_IIT2002_T1 Número perfecto

Solución Propuesta: s2Eva_IIT2002_T1 Número perfecto

2Eva_IIT2002_T3 Encriptar PIN(4 dígitos)

Solución propuesta: s2Eva_IIT2002_T3 Encriptar PIN(4 dígitos)

2Eva_IT2008_T2 Validar cédula ecuatoriana

Solución propuesta: s2Eva_IT2008_T2 Validar cédula ecuatoriana

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.