5. Funciones

Contenidos

  1. Librerías Pre - Definidas.
  2. Definición de funciones propias.
  3. Funciones que retornan datos.
  4. Funciones que no retornan datos (subrutinas, procedimientos).
  5. Más sobre funciones.
  6. Ejercicios.

5.1 Librerías Pre - Definidas

Vamos a resolver un problema sencillo : calcular los lados de un triángulo rectángulo dado el valor de un ángulo, α y la hipotenusa, c. Las fórmulas para calcular los lados a y b son: a = c * sen α y b = c * cos α. Es decir, para este sencillo problema, ¡necesitamos calcular el seno y coseno de un ángulo! Afortunadamente, este tipo de cálculo es tan frecuente que Python ya trae incorporadas las funciones seno y coseno (y muchas más) y solo necesitamos importarlas para dejarlas disponibles en nuestro programa. Para importar las funciones matemáticas, debemos incluir la instrucción “import math” al principio de nuestro programa. Luego, simplemente podemos usar las funciones, que en este caso son 3:

  • math.radians(n) que recibe un ángulo n (en grados) y entrega su valor equivalente en radianes
  • math.cos(r) que entrega el coseno del ángulo r (en radianes), y
  • math.sin(r) que entrega el seno del ángulo r (en radianes)

Entonces, nuestro código quedaría de la siguiente manera:

Ahora, toma unos minutos para ir a la documentación del módulo math de Python: https://docs.python.org/3/library/math.html. Revisa las funciones que vienen implementadas: ¡son muchas! Y te permitirán incluir todo tipo de cálculos matemáticos en tu programa. Después de la revisión del módulo math, considera lo siguiente: desde tu primer programa en Python, usaste funciones, ya que usaste instrucciones predefinidas en Python que realizaban alguna acción. ¿Cuáles funciones conoces? Si respondiste print, estás en lo correcto! Otras funciones que puedes haber usado son input, int, float, y str. Revisa todo el listado de funciones que vienen definidas en Python (sin necesidad de importar nada) en el siguiente link: https://docs.python.org/3/library/functions.html Otra función útil viene en el módulo random, y sirve para darle algo de aleatoriedad a nuestros programas, es decir, para que sucedan cosas al azar. Por ejemplo, para lanzar un dado! Los parámetros que recibe la función son el rango de valores dentro de los cuales se generará el número al azar. Así, por ejemplo random.randint(6,25) nos entregará un valor al azar entre 6 y 25 (ambos inclusive).

5.2 Definición de funciones propias

Imagina que quieres escribir un programa que dibuje una línea, y que para ello existe la instrucción dibujar_linea(). Dibujar una línea será tan simple como escribir esa instrucción. Ahora, imagina que también existe una instrucción para rotar el lápiz hacia la izquierda en x grados, y que se llama rotar_izq(x). El código para dibujar un cuadrado sería:

dibujar_linea()
rotar_izq(90)
dibujar_linea()
rotar_izq(90)
dibujar_linea()
rotar_izq(90)
dibujar_linea()
rotar_izq(90)

o bien:

i=0
while i<4:
  dibujar_linea()
  rotar_izq(90)
  i+=1

Ahora, imagina que quieres dibujar una figura como la que se muestra a continuación:

Figura 5.1
Figura 5.1. Figura ejemplo cuadrado.

No te asustes; esta figura es simplemente un gran número de cuadrados, dibujados uno tras otro, de la siguiente manera:

Figura 5.2
Figura 5.2. Figura ejemplo cuadrado 2.

En este caso, vamos a querer repetir muchísimas veces el código para dibujar un cuadrado. Por simplicidad, lo mejor es que podamos darle un nombre al código para dibujar un cuadrado, por ejemplo: dibujar_cuadrado(), y luego llamemos a ese nombre todas las veces que queramos.

for i in range(4):
  dibujar_linea()
  rotar_izq(90)

Lo llamaremos:

dibujar_cuadrado()

Ahora, para hacer el dibujo anterior solo debemos hacer lo siguiente:

i=0
while i<36:
  dibujar_cuadrado()
  rotar_izq(10)
  i+=1

Acabamos de crear nuestra primera función. Ahora, veremos cómo definir funciones de manera más formal.

5.3 Funciones que retornan datos

Como vimos, definir una función sirve para separar código que vamos a reutilizar muchas veces. Definir funciones además es útil para reutilizar código; por ejemplo todo el código de math y random son funciones que ya vienen definidas y no necesitaremos volver a definirlas. Pero es útil definir también nuestras propias funciones; no podemos depender siempre de lo que venga ya hecho en Python. Veamos el siguiente problema (que no es un problema matemático; las fórmulas están todas dadas). Un triángulo como el de la figura, que pasa por el centro de una circunferencia, tiene necesariamente que tener uno de sus lados igual al diámetro. En este caso, si queremos calcular el área pintada de azul, necesitamos calcular el área del círculo y restarle el área del triángulo.

Figura 5.3
Figura 5.3. Figura ejemplo triángulo.
import math

a=float(input("a? "))
b=float(input("b? "))
c=float(input("c? "))
area_triangulo = 1/4 * math.sqrt(4 * a**2 * b**2 - (a**2 + b**2 - c**2)**2)
radio = max(a, b , c) / 2
area_circulo=math.pi * (radio ** 2)
print("area = " + str(area_circulo - area_triangulo))

El código anterior es correcto, pero ¿qué pasaría si tuviéramos funciones para calcular el área de un círculo y de un triángulo? El código podría quedar mucho más legible. Por ejemplo, así:

a=float(input("a? "))
b=float(input("b? "))
c=float(input("c? "))
radio = max(a,b,c) / 2
print("area = " + str(area_circulo(radio) - area_triangulo(a,b,c)))

Este código lee las tres variables a, b y c, y calcula el radio, pero luego solamente hace llamados a las funciones area_circulo y area_triangulo para hacer los cálculos. Examinemos la función area_circulo con más detalle. Para calcular el área de un círculo, necesitamos tener disponible el radio del círculo. Lo que una función necesita recibir para hacer sus cálculos es llamado el “parámetro” de la función.

Figura 5.4
Figura 5.4. Funciones.

La función recibirá, entonces, el radio del círculo, hará los cálculos correspondientes, y devolverá, o retornará, el valor del área resultante.

def area_circulo(radio):
  resultado = math.pi*radio**2
  return resultado

En el momento en que se ejecuta la instrucción return, la función terminará, devolviendo el valor que acompaña a return (en este caso, resultado). Veamos cómo funcionan otros ejemplos sencillos. Primero, es importante saber que podemos escribir una función que reciba más de un parámetro; para que eso suceda, simplemente debemos listar los parámetros separados por comas. Por ejemplo, una función que suma dos números a y b:

Ejemplo 5.1

En este ejemplo mostraremos la creación y uso de una función básica. La función suma dos números y retorna su resultado. Al retornar el resultado este se puede almacenar en una variable.

5.4 Funciones que no retornan datos (subrutinas, procedimientos)

No es obligación que las funciones retornen algo (de hecho, la función print, que ya conoces, no retorna ningún valor, solo realiza una acción. Para la misma función anterior (que suma dos números), mira lo que pasa si es que en vez de usar la instrucción return, usamos un print.

Ejemplo 5.2

En este ejemplo mostraremos la creación y uso de una función básica. La función suma dos números e imprime su resultado. Como esta función no retorna nada, no se puede almacenar su resultado en una variable.

¿Qué pasó? La función no tiene ninguna instrucción return, en vez, imprimió en pantalla el valor de c. Pero ten cuidado, este comportamiento no es el más típicamente útil: por lo general, queremos poder guardar el resultado de una función para luego hacer alguna acción a partir de él (incluso, si queremos, imprimirlo).

5.5 Más sobre funciones

Las funciones, en general, pueden retornar un valor, de cualquier tipo (int, float, bool, str, o tipos que aún no conocemos como listas, tuplas y objetos). Además, puedes utilizar dentro de una función cualquier instrucción de Python que conozcas (incluídas llamadas a otras funciones). Recuerda que cuando se ejecuta la instrucción return, la función termina, volviendo al punto de llamado, ¡incluso si estás dentro de un ciclo while!

Ejemplo 5.3

En este ejemplo haremos una función que retorna un valor booleano (True o False). Hacer una función que reciba un número y retorne True si el número es positivo. Luego hacer una función que reciba un número y retorne True si es primo. Luego hacer un programa que pida un número al usuario, y si este es positivo, compruebe si es o no es primo.

Ejemplo 5.4

En este ejemplo usaremos un if y un loop dentro de una función. Hacer un programa que reciba dos números n y m como parámetros. El programa debe imprimir los números desde el 1 hasta el n dando saltos de m.

Ejemplo 5.5

En este ejemplo crearemos la función factorial, que calculará el factorial de un número n. Luego, usaremos esta función dentro de otra, que recibe un número m e imprime la evaluación de la función factorial de los números desde el 1 hasta el m.

5.6 Ejercicios

A continuación, te proponemos varios ejercicios para que los resuelvas en tu libro interactivo.

Ejercicio 5.1

Haz una función que recibe la base y la altura de un triángulo y calcule su área.

Ejercicio 5.2

En la siguiente actividad se revisará automáticamente el resultado de tu programa. Debes crear una función llamada multiplicar y otra llamada dividir. Ambas reciben dos números a y b y retornan la multiplicación de los números y su división respectivamente.

Ejercicio 5.3

Ahora debes hacer un calculador de promedios. Realiza una función que pida al usuario un número n que represente la cantidad de números que se van a ingresar. Luego se deben pedir n números al usuario. La función debe retornar su promedio.

Ejercicio 5.4

Ahora debes hacer una programa que detecta números primos. Realiza una función que pida al usuario un número n que represente la cantidad de números que se van a ingresar. Luego se deben pedir n números enteros al usuario. Imprime para cada número mayor a 1 si es primo o no.

Ejercicio 5.5

Haz una función que reciba un dígito que representa una operación (1 para suma, 2 para resta, 3 para multiplicación y 4 para división) y dos números. La función debe retornar el resultado de operar los dos números con la operación señalada. Cada operación debe ser encapsulada en una función.

Next Section - 6. Strings: Cadenas de caracteres