Fundamentos de la programación (Python)
[M9] Funciones
En este módulo trabajaremos con funciones.
Las funciones son las entidades organizativas más básicas de un programa. Permiten encapsular las operaciones comunes de los programas en un bloque de código reutilizable, idealmente con un nombre que describa claramente lo que hace la misma. Esto hace que el código sea más legible, facilita la depuración y limita los errores al momento de desarrollar código.
Una función se pueden definir como un bloque de código que realiza alguna operación utilizando, opcionalmente, parámetros o valores de entrada y retornando valores de salida.
Generalmente, los lenguajes de programación cuentan con una biblioteca de funciones ya predefinidas, como por ejemplo la función abs() (sin parámetros de entrada) o la función round(número, decimales) que tiene dos parámetros de entrada. Sin embargo, podemos definir nuestras propias funciones. Tenemos dos tipos de funciones, en consecuencia
- Funciones estándar: Que pertenecen a la biblioteca de funciones del lenguaje.
- Funciones definidas por el usuario: Creadas por nosotros y basadas en nuestros requerimientos.
Asimismo, una función puede ser invocada, o llamada, desde cualquier lugar del programa. Los valores que se pasan a la función se denominan argumentos, cuyos tipos de datos deben ser compatibles con los tipos de datos de los parámetros en la definición de la función.
Python interpreta el bloque de funciones solo cuando se llama a la función y no cuando se define la misma. Por esta razón si el bloque de definición de la función contiene algún tipo de error, el intérprete de Python lo señalará solo cuando se llame a la función.
Contenido
Definir una función
Para definir una función en Python se utiliza la palabra reservada def seguida del nombre que se le desea asignar. A continuación del nombre se le agregan dos paréntesis (que contendrán en su interior opcionalmente, sus parámetros de entrada) y para finalizar la linea de declaración se utilizan dos puntos (:).
Ejemplos:
def saludar():
print('¡Hola mundo!')
def saludar_persona(persona):
mensaje = '¡Hola ' + persona + '!'
return mensaje
Invocar una función
Para ejecutar el código dentro de la función, tienes invocar/llamar a la función. Esto se hace escribiendo su nombre seguido de paréntesis de apertura y cierre. Si la función tiene parámetros de entrada, se envían los argumentos entre los paréntesis. Una función se puede invocar tantas veces como se desee.
Para poder invocar una función, ésta se tiene que haber definido previamente antes del código que la invoca.
Ejemplos:
saludar()
>>> ¡Hola mundo!
print(1, saludar_persona('Laura'))
print(2, saludar_persona('Andrés'))
>>> 1 ¡Hola Laura!
>>> 2 ¡Hola Andrés!
Elementos de una función:
En resumen, los elementos de una función son los siguientes:
- La palabra clave def seguida del nombre de la función
- “()” paréntesis que pueden o no, incluír parámetros de entrada (opcionales).
- “:” dos puntos.
- Bloque de código
- instrucción return con los parámetros de salida (opcional).
Argumentos de una función
Como hemos visto, para invocar a una función se especifica su nombre, seguido de una lista de argumentos cerrados entre paréntesis y separados por comas. Si la función no requiere ningún argumento, se escribe a continuación del nombre de la función un par de paréntesis vacíos.
Por defecto, los argumentos en Python van enlazados con sus parámetros según la posición en la cual se envíen dentro de los paréntesis (a menos que se indique expresamente el nombre del parámetro que recibirá a cada argumento).
Ejemplo:
# DEFINICION DE LA FUNCION
def nombre_completo(nombre, apellido):
nom = nombre + apellido
print('Tu nombre completo es: ', nom)
Invocando la función nombre_completo. Ejemplo:
# UTILIZACION DE LA FUNCION
tu_nombre = input('Escribe tu nombre:) #Ejemplo: Pepito
tu_apellido = input('Escribe tu apellido:) #Ejemplo: Grillo
nombre_completo(tu_nombre, tu_apellido)
>>> Tu nombre completo es: Pepito Grillo
# Si se envían los argumentos en un orden diferente al establecido,
# el parametro nombre recibirá al argumento tu_apellido
# y el parametro apellido recibirá al argumento tu_nombre
tu_nombre = input('Escribe tu nombre:) #Ejemplo: Pedro
tu_apellido = input('Escribe tu apellido:) #Ejemplo: Picapiedra
nombre_completo(tu_apellido, tu_nombre )
>>> Tu nombre completo es: Picapiedra Pedro
Paso de argumentos por nombre
Para evitar que la función haga la correspondencia entre parámetros y argumentos, por posición, Python permite realizar el paso de argumentos por nombre. Tomemos el caso anterior de Pedro Picapiedra:
# DEFINICION DE LA FUNCION
def nombre_completo(nombre, apellido):
nom = nombre + apellido# UTILIZACION DE LA FUNCION
print('Tu nombre completo es: ', nom)
tu_nombre = input('Escribe tu nombre:) #Ejemplo: Pedro
tu_apellido = input('Escribe tu apellido:) #Ejemplo: Picapiedra
nombre_completo(apellido=tu_apellido, nombre=tu_nombre )
>>> Tu nombre completo es: Pedro Picapiedra
Definir valores por defecto para un argumento
Python también permite asignar valores por defecto para los argumentos de una función. Esto convierte un parámetro en opcional; siendo el valor indicado en la definición de la función, el valor que se tomará por defecto en caso de que no se envíe uno en concreto. Definir el valor por defecto de un argumento, evita muchos problemas en la utilización de un programa.
Un ejemplo de función de la biblioteca de Python, que tiene parámetros opcionales, es la función round(número, ndigitos), en la cual el argumento ndigitos es opcional, siendo su valor por defecto 0.
Los valores para los parámetros opcionales se indican con el operador '=', tienen un valor por defecto y siempre se definen después de los parámetros obligatorios. Ejemplo:
# DEFINICION DE LA FUNCION
# La siguiente funcion recibirá una hora en formato hh:mm 24
# Por defecto, la hora será 12:00
# En función de la hora que se reciba, devolverá un saludo u otro
def saludar_tiempo(hora = '12:00'):
if hora <= '14:00':print('¡ Buenos dias ! ')elif hora <= '20:00':print('¡ Buenas tardes ! ')else:print('¡ Buenas noches ! ')
# UTILIZACION DE LA FUNCION
saludar_tiempo('19:00')
saludar_tiempo('21:00')
saludar_tiempo()
>>> ¡ Buenas tardes !
>>> ¡ Buenas noches !
>>> ¡ Buenos dias !
Parámetros de longitud variable
Se entiende por parámetros de longitud variable a aquellos parámetros que no conocen a ciencia cierta, cuál es la cantidad de argumentos que va a recibir, es decir, el número de argumentos que se recibe es indeterminado.
Los parámetros de longitud variable se definen con el operador * para las tuplas, o con ** para los diccionarios. De esta manera, cuando se utiliza una función con estos argumentos variables se pueden pasar tantos elementos como se necesite.
Argumentos en forma de tupla
Los argumentos en forma de tupla se reciben mediante un parámetro que se dfine con el operador *. Ejemplo:
# DEFINICION DE LA FUNCION
# Esta función calcula el promedio
# de un conjunto indeterminado de números utilizando tuplas.
def promedio(*numeros):# verificamos el tipo de datos
print(type(numeros))
total = 0
cuenta = len(numeros)
for n in numeros:
total += navg = total/cuenta
print('El promedio de los', cuenta, 'numeros es ', round(avg,2))
# UTILIZACION DE LA FUNCION
promedio(6)
promedio(6, 4, 10)
promedio(1, 3, 5, 4)
>>> <class 'tuple'>
>>> El promedio de los 1 numeros es 6.0
>>> <class 'tuple'>
>>> El promedio de los 3 numeros es 6.67
>>> <class 'tuple'>
>>> El promedio de los 4 numeros es 3.25
Argumentos en forma de diccionario
Otra forma de manejar una cantidad variable de argumentos en Python es utilizando el doble operador **. Si usamos este operador antes del nombre de un argumento, Python creará un diccionario con los nombres de los argumentos como llaves y los valores como valores. Ejemplo:
# DEFINICION DE LA FUNCION
# Esta función calcula el promedio de notas
# de un conjunto indeterminado de estudiantes.
def promedio_notas(**kwargs):
suma = 0
cuenta = 0
for key, value in kwargs.items():
print(key, 'tiene una calificación de', value, 'puntos')print('El promedio de notas de la clase es:', suma/cuenta)
suma += value
cuenta +=1
# UTILIZACION DE LA FUNCION
promedio_notas(Ana=10, Nuria=9, Juan=8, Pedro=9)
di = {'Aina': 8, 'Marc':7}
promedio_notas(**di)
>>> Ana tiene una calificación de 10 puntos
>>> Nuria tiene una calificación de 9 puntos
>>> Juan tiene una calificación de 8 puntos
>>> Pedro tiene una calificación de 9 puntos
>>> El promedio de notas de la clase es 9.0
>>> Aina tiene una calificación de 8 puntos
>>> Marc tiene una calificación de 7 puntos
>>> El promedio de notas de la clase es 7.5
La instrucción return
La instrucción return es una cláusula opcional que se puede incluir al final de la definición de una función, seguida del resultado que queremos devolver (parámetro de salida). Ejemplo:
# DEFINICION DE LA FUNCION
def area_triangulo(base, altura):
area = (base * altura) / 2# UTILIZACION DE LA FUNCION
return area
base_triangulo = float(input('Indica la base del triángulo:')) # 5
altura_triangulo = float(input('Indica la altura del triángulo:')) # 2
areat = area_triangulo(base_triangulo, altura_triangulo)
print('El área del triángulo es:', areat)
>>> El área del triángulo es: 5.0
Anotaciones
Las anotaciones en funciones nos permiten añadir el tipo de los argumentos de entrada y salida de una función.
- Para indicar el tipo de los argumentos de entrada, se escribe el nombre, seguido de dos puntos y el tipo de datos.
- Para indicar el tipo del argumento de salida, se escribe a continuación del paréntesis de cierre que engloba a los argumentos de entrada, una flecha seguida del tipo de datos.
El objetivo de las anotaciones es la documentación del código. Sin embargo, no restringen el tipo de los argumentos que se envían a una función (no retorna un error, si se envía un tipo diferente y éste es compatible con las operaciones de la función).
Veamos a la función area_triangulo con anotaciones:
# DEFINICION DE LA FUNCION
def area_triangulo(base: float, altura: float) -> float:
area = (base * altura) / 2
return area