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.
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 listawhile i<(n-1): # hasta penúltimo
j = i+1 # siguiente de iwhile j<n: # hasta el últimoif X[j]<X[i]: #intercambia i con j
aparta = X[i]
X[i] = X[j]
X[j] = aparta
j = j + 1
i = i + 1
# SALIDAprint(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)
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.
Se 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 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]
# SALIDAprint('El menor precio:')
print('donde:',donde)
print('cuanto:',cuanto)
El bloque de procedimiento se convierte a una función denominada menor, con variable de entrada vector y variable de salida donde.
# algoritmo del menordefmenor_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]
# SALIDAprint('El menor precio:')
print('donde:',donde)
print('cuanto:',cuanto)
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.
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:
deffuncion(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 problemaimport numpy as np
import random as np
# funciones creadas por usuariodefmiprimerafuncion(variableentrada,otravariable):
# algunas instruccionesreturn(respuesta)
# INGRESO
a = int(input(' un numero entero'))
b = float(input(' un numero real'))
# PROCEDIMIENTO
respuesta = miprimerafuncion(a,b)
# SALIDAprint('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.
Para el manejo combinado de palabras y números, varias palabras, varias frases, se usa el concepto de Listas.
Las listas operan como un conjunto de datos de diferente tipo: cadenas junto a texto, conteniendo subconjunto de listas con diferentes dimensiones.
Una «lista» de datos como un vector es, por ejemplo, la lista del curso con los nombres de los participantes:
>>> lista = ['Juan','María','Pedro']
>>> lista
['Juan', 'María', 'Pedro']
>>> len(lista)
3
>>>
Añadir elementos: Append()
Luego ‘Ana’ decide registrarse en el curso, y debe añadirse su nombre a la lista del curso. La instrucción para añadir elementos en la lista es append() que es semejante a la instrucción de concatenar elemantos a un vector o una cadena.
Siguiendo con el ejemplo anterior, para revisar si ‘Pedro’ y ‘Carlos’ se encuentra en la lista del curso. Si está en la lista, para identificar la posición o índice donde se encuentra, se usa la instruccion .index().
>>> 'Pedro' in listacurso
True
>>> 'Carlos' in listacurso
False
>>> donde = listacurso.index('Pedro')
>>> donde
2
El manejo de texto en computador requiere una representación de los símbolos o letras que se usan en un idioma.
Cada símbolo, letra o «caracter» que se presenta al escribir en pantalla se convierte en una sucesión ordenada de imágenes, semejante a agrupar las fichas del juego Scrabble
Una palabra se puede observar como las casillas de un vector, dando la pauta para el manejo de texto en el computador.
En Python, el texto para los mensajes en las preguntas input y las salidas print se escriben entre comillas " o apóstrofes '. Cada letra de una palabra se puede identificar por su posición como en un vector.
Si al unir palabras se forma una oración, el concepto se extiende a programación como «concatenar«. Básicamente concatenar es la unión de varias palabras para formar una oración un título o un mensaje.
Para convertir una frase o palabra a mayúsculas o viceversa, se usan las instrucciones: palabra.upper() y palabra.lower().
Siguiendo el ejemplo anterior, el ejemplo de uso es:
>>> frase
'El saber no ocupa lugar'
>>> enmayusculas = frase.upper()
>>> enmayusculas
'EL SABER NO OCUPA LUGAR'
>>> enminusculas = frase.lower()
>>> enminusculas
'el saber no ocupa lugar'
>>>
Comparar cadenas o strings
También es posible comparar caracteres, o cadenas entre si, por ejemplo para buscar cuántas vocales tiene una palabra. Considere que los caracteres o ‘dibujos de letras’ mayúsculas son diferentes a los de minúsculas.
Se puede comparar el orden alfabético de los caracteres, pues el computador los almacena en una posición ordenada, semejante a un vector [‘a’,’b’,’c’, … ]
En Python se pueden obtener los datos de las matrices desde archivos, o almacenar las matrices hacia archivos. Así, cuando las matrices son de grandes dimensiones, no será necesario tener que escribir los valores de las matrices cada vez que se requiera hacer una operación.
En librería Numpy , existen funciones incorporadas para guardar o abrir una matriz desde un archivo en formato .txtcon las instrucciones: np.savetxt(), np.loadtxt()
Guardar matriz en archivo.txt con Numpy
Para guardar una matriz a un archivo use: numpy.savetxt('matriz.txt', matriz)
se puede encontrar en archivo.txt en el directorio de trabajo de Python
El archivo puede ser abierto para observar desde el «block de notas»
Abrir archivo.txt de una matriz con Numpy
Continuando con el ejercicio anterior, para abrir o leer desde un archivo en formato de texto ‘matriz.txt‘, se dispone de la instrucción de Numpy: np.loadtxt('matriz.txt',dtype=int)
La instrucción permite indicar el tipo de datos que se usan en el arreglo.
>>> A = np.loadtxt('matriz00.txt',dtype=int)
>>> A
array([[1, 2, 3],
[4, 5, 6]])
>>> B = np.loadtxt('matriz00.txt')
>>> B
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
Nota: lo importante es el formato del archivo en tipo texto. Algunas veces los archivos tienen extensión .dat que también pueden ser leídos.