IWI-131 Programación¶
Funciones¶
Hasta el momento hemos utilizado funcionas predefinidas en el núcleo de Python, como round()
y abs()
, o importadas desde bibliotecas, como sqrt()
de math y randint()
de random.
En esta unidad aprenderemos a definir nuestras propias funciones para resolver tareas específicas.
Para definir una función y poder llamarla posteriormente desde nuestro programa o desde otra función, debemos tener en cuenta:
- El nombre que le daremos a la función, que debemos elegir siguiendo las mismas reglas que usamos para nombrar variables.
- Los parámetros que tendrá la función, y el orden en que aparecen en la definición.
- El valor de retorno que entregará la función una vez que lleve a cabo su trabajo.
Al llamar a una función la ejecución del programa se traslada al código de la función, copiando a los parámetros los argumentos utilizados en el llamado. Cuando la función termina, la ejecución vuelve al punto del llamado, llevando consigo el valor de retorno.
Definición de una función¶
Para definir una función utilizamos la palabra reservada def
:
def nombre_funcion(parametro1, parametro2, ...):
Los parámetros tienen nombres que elegimos al definir la función. En la práctica, los parámetros son variables que asumen los valores de los argumentos dados a la función cuando es llamada.
Al escribir una función, suponemos que sus parámetros ya traen valores y simplemente los utilizamos a través del nombre que le damos a los parámetros.
El caracter de dos puntos al final de la definición es obligatorio.
Las instrucciones que componen la función deben aparecer indentadas a partir de la línea siguiente a la definición.
Una instrucción especial, return
, se utiliza para indicar el fin de la ejecución de la función y el valor que retornará como resultado. Esta instrucción puede aparecer más de una vez en el código de la función, normalmente dentro de condicionales.
La instrucción return
cumple $2$ propósitos:
- Termina la ejecución de la función, volviendo al punto donde fue llamada.
- Especifica el resultado de la ejecución de la función, el que será entregado al punto de llamado.
Llamado de la función¶
Las funciones deben ser definidas antes del punto donde son llamadas. De lo contrario se produce un error de ejecución.
Para llamar una función se utiliza su nombre y se incluye entre paréntesis la lista de argumentos que serán copiados, en el mismo orden en que aparecen, a los parámetros definidos en la función.
Al momento de hacer el llamado debe considerarse lo que el programa hará con el valor de retorno de la función, el que reemplazará el llamado de la función cuando ésta termine.
Ejemplo 1¶
Escriba una función que determine si un número es par o no, retornando True
o False
, según corresponda.
def es_par(num):
if num%2==0:
return True
else:
return False
Ahora podemos usar la función para determinar si un número es par:
resultado = es_par(5)
En este caso, la variable resultado contendrá el valor False
, pues el número $5$ no es par. Observe la forma en que se hace el llamado, escribiendo en el paréntesis un argumento para el parámetro que espera la función, y utilizando el valor de retorno que la función entrega; en este caso, almacenando ese valor en la variable resultado.
La función anterior podría escribirse de manera más corta, como se ve a continuación:
def es_par(num):
if num%2==0:
return True
return False
Observe que se eliminó la componente else
del if
. Sin embargo, la función lleva a cabo su trabajo de la misma manera.
Si el número es par, se ejecutará la instrucción return True
, provocando que la función retorne de inmediato con su resultado sin ejecutar ninguna instrucción más de la función a partir de ahí. Por otra parte, si el número es impar, el if
no tendrá efecto y llegará hasta la última instrucción en donde retorna el valor False
.
Finalmente, la siguiente es una forma aún más sucinta para hacer lo mismo:
def es_par(num):
return num%2==0
La función lleva a cabo la comparación y retorna el resultado de esa comparación. Cuando el número es par, la comparación dará como resultado True
y eso es lo que retornará. Cuando es impar, la comparación será False
, y la función retornará ese valor.
Ejemplo 2¶
Escriba una función que determine el número de dígitos que tiene un número entero.
def num_digitos(n):
nd = 0
while n>0:
n //= 10
nd += 1
return nd
Ejemplo 3¶
Escriba una función que calcule el discriminante de una ecuación de segundo grado, dados los valores de $a$, $b$ y $c$:
def discriminante(a,b,c):
resultado = b**2-4*a*c
return resultado
Podemos llamar esta función, de la siguiente manera:
var_resultado = discriminante(1,4,2)
El resultado que entregó la función se almacenó en la variable var_resultado:
var_resultado
8
Ejemplo 4¶
Escriba un programa para resolver las ecuaciones de segundo grado, utilizando la función anterior.
def discriminante(a,b,c):
resultado = b**2-4*a*c
return resultado
p1 = float(input('Ingrese el valor a:'))
p2 = float(input('Ingrese el valor b:'))
p3 = float(input('Ingrese el valor c:'))
var_resultado = discriminante(p1,p2,p3)
if var_resultado < 0:
print('La ecuacion no tiene solucion real')
elif var_resultado == 0:
sol = -p2 / (2*p1)
print('La solucion es unica y es sol=', sol)
else:
sol = (-p2 - (var_resultado**0.5))/(2*p1)
sol2 = (-p2 + (var_resultado**0.5))/(2*p1)
print('Las soluciones son:')
print('sol=', sol)
print('sol2=', sol2)
Ingrese el valor a:1 Ingrese el valor b:-1 Ingrese el valor c:-12 Las soluciones son: sol= -3.0 sol2= 4.0
Diferencia entre print()
y return
¶
Al trabajar con funciones es importante comprender la diferencia entre print
y return
, pues normalmente quienes están aprendiendo a programar tienden a confundirlas.
Anteriormente escribimos programas que recibían entradas del usuario a través de input
y escribían resultados a la pantalla utilizando print
. Estos son los principales mecanismos de interacción entre nuestros programas y las personas que los utilizan.
Por otra parte, las funciones no interactúan directamente con las personas, sino con otras componentes del programa desde son llamadas y a las cuales les devolvemos resultados. Es decir, a una función no la llama una persona, sino otra parte del programa.
Cuando la función es llamada, se le proveen los datos que requiere para trabajar a través de los parámetros. La función utiliza esos valores sin necesidad de leerlos (pues ya vienen cargados en los parámetros) y con ellos lleva a cabo su tarea.
Al finalizar, el resultado es entregado a través de la instrucción return
, que hará que el valor llegue a la parte del programa donde se hizo el llamado.
Recuerda este ejemplo:
var_resultado = discriminante(1,4,2)
Aquí llamamos a la función con los parámetros que queremos que trabaje. La función retornará el resultado, que será almacenado en la variable var_resultado. No hay input
y no hay print
en esta interacción, pues quienes están interactuando son componentes del programa y no personas.
Como regla general:¶
No utilizamos
input
dentro de una función. Las entradas que entregan las personas que usan el programa son leídas en el programa principal, fuera de las funciones.No utilizamos
print
dentro de una función. Las funciones entregan sus resultados a través de return, y en el programa principal son entregadas a las personas que usan el programa a través deprint
.
Ejercicios¶
Ejercicio 1¶
Escriba la función promedio(n1, n2, n3)
que reciba las notas de los 3 certámenes de la asignatura y retorne el valor del promedio.
def promedio(n1, n2, n3):
suma = p1 + p2 + p3
prom = suma / 3
return prom
Ejercicio 2¶
El riesgo de que una persona sufra enfermedades coronarias depende de su edad y su índice de masa corporal.
El Indice de masa corporal (IMC) es el cociente entre el peso del individuo en kilos y el cuadrado de su estatura en metros.
Escriba una función que reciba como parámetros la estatura, el peso y la edad de la persona , y le entregue su condición de riesgo.
edad < 45 | edad ≥ 45 | |
IMC < 22 | bajo | medio |
IMC ≥ 22 | medio | alto |
def IMC(est, peso, edad):
indice = peso/(est**2)
if edad < 45:
if indice < 22.0:
condicion = 'bajo'
else:
condicion = 'medio'
else:
if indice < 22.0:
condicion = 'medio'
else:
condicion = 'alto'
return condicion
Ejercicio 3¶
Un viajero desea saber cuánto tiempo tomó un viaje que realizó. Él conoce la duración (en minutos) de cada uno de los tramos del viaje por separado.
Desarrolle un programa, que contenga al menos una función, que permita ingresar los tiempos de viaje de los tramos y entregue como resultado el tiempo total de viaje en formato: horas
horas con minutos
minutos
El programa deja de pedir tiempos de viaje cuando se ingresa un 0.
Ejemplo:
- Duración del tramo: 15
- Duración del tramo: 30
- Duración del tramo: 87
- Duración del tramo: 0
- Tiempo total de viaje : 2 horas con 12 minutos
def transformacion(total_min):
horas = total_min/60
return int(horas)
def transformacion2(total_min):
minutos = total_min%60
return minutos
flag = True
total_min = 0
while flag:
minutos = int(input('Duracion del tramo: '))
if minutos == 0:
flag = False
else:
total_min = total_min + minutos
horas = transformacion(total_min)
minutos = transformacion2(total_min)
print('Tiempo total de viaje:', horas, 'horas con', minutos, 'minutos')
Duracion del tramo: 40 Duracion del tramo: 30 Duracion del tramo: 60 Duracion del tramo: 70 Duracion del tramo: 0 Tiempo total de viaje: 3 horas con 20 minutos
Ejercicio 4¶
Realice el ruteo del problema anterior con las siguientes duraciones de tramos: 40, 35, 60, 70.