Bloque 105. Funciones
Revisa los siguientes apartados de la Unidad para resolver los ejercicios:
Ejercicio 1. Tu primera función: tarifa de aparcamiento
Escribe una función con la siguiente firma:
def calcular_importe(horas)
Debe calcular y devolver el importe a pagar en un parking, según estas reglas:
- Hasta 1 hora: gratis.
- De 1 a 4 horas: 1,50 €/hora.
- Más de 4 horas: 6 € las 4 primeras horas + 1 €/hora adicional.
El script principal debe limitarse a pedir al usuario las horas de estancia, llamar a la función y mostrar el resultado.
💾 Haz un commit al terminar el ejercicio.
Ejercicio 2. Una función, varios usos
Escribe una función con la siguiente firma:
def es_primo(numero)
Debe devolver True o False. Reutilízala en dos programas distintos dentro del mismo script:
- Uno que muestre todos los primos entre 2 y un límite dado por el usuario.
- Otro que pida números al usuario en un bucle (hasta que introduzca
0) e indique, para cada uno, si es primo.
El objetivo es que veas cómo la misma función se reutiliza en dos contextos distintos sin reescribir la lógica de comprobación.
💾 Haz un commit al terminar el ejercicio.
Ejercicio 3. Parámetros con valor por defecto y ámbito
Escribe una función con la siguiente firma:
def saludar(nombre, formal=False)
Debe devolver:
"Buenos días, {nombre}."siformalesTrue"¡Hola, {nombre}!"en caso contrario.
Llama a la función con y sin el segundo argumento. Después, dentro de la función, crea una variable local con el mismo nombre que una variable del programa principal y comprueba (imprimiéndola en ambos sitios) que modificarla dentro de la función no afecta a la de fuera.
💾 Haz un commit al terminar el ejercicio.
Ejercicio 4. Funciones que se llaman entre sí
Escribe tres funciones para un pequeño juego de dados, con las siguientes firmas:
def tirar_dado()
def tirar_dos_dados()
def jugar_ronda()
tirar_dado(): devuelve un número aleatorio entre 1 y 6.tirar_dos_dados(): llama dos veces a la anterior y devuelve la suma.jugar_ronda(): llama atirar_dos_dados(), la compara con una tirada de la "banca" (otra llamada atirar_dos_dados()) y muestra el mensaje"Ganas tú","Gana la banca"o"Empate", según corresponda.
El programa principal solo debe llamar a jugar_ronda().
Para simular una tirada de dado usa random.randint(1, 6), tras escribir import random al principio del script. Todavía no hemos explicado en detalle qué es un módulo (eso llega más adelante), así que de momento úsalo tal cual, como una herramienta más que te presta Python.
import random
n = random.randint(1, 6)
print(n) # Muestra un número aleatorio entre 1 y 6
💾 Haz un commit al terminar el ejercicio.
Ejercicio 5. Una función, varios valores de retorno
Escribe una función con la siguiente firma:
def estadisticas(a, b, c)
Debe recibir tres números y devolver, a la vez, el mínimo, el máximo y la media.
Python permite devolver varios valores separados por comas, que se recogen con minimo, maximo, media = estadisticas(...). Esa estructura se denomina tupla y se estudiará en un bloque más adelante.
t = (2, 4, 6)
print(t)
Pide los tres números al usuario y muestra los tres resultados.
💾 Haz un commit al terminar el ejercicio.
Ejercicio 6. Validador reutilizable en un menú
Escribe una función con la siguiente firma:
def es_nombre_valido(texto)
Debe devolver True solo si el texto no está vacío y no contiene ningún dígito.
Úsala dentro de un bucle de un pequeño registro de usuarios:
- Pide un nombre repetidamente hasta que sea válido.
- Después, pide también la edad (
int) y el email (str), sin validarlos.
Al terminar, muestra los tres datos recogidos. La función no debe imprimir nada: solo devuelve True/False, y es el bucle quien decide qué mostrar.
💾 Haz un commit al terminar el ejercicio.
Ejercicio 7. Conversor de temperatura con valor por defecto
Escribe una función con la siguiente firma:
def convertir_temperatura(grados, a_fahrenheit=True)
Debe convertir de Celsius a Fahrenheit por defecto (grados * 9/5 + 32), o de Fahrenheit a Celsius si se llama con a_fahrenheit=False ((grados - 32) * 5/9).
Llámala varias veces:
- Sin el segundo argumento.
- Con el argumento en posición.
- Con el argumento como argumento con nombre (
a_fahrenheit=False).
💾 Haz un commit al terminar el ejercicio.
Ejercicio 8. Función que valida con un bucle interno
Escribe una función con la siguiente firma:
def pedir_entero_positivo(mensaje)
Debe mostrar el mensaje recibido, leer un valor con input() dentro de un bucle while (como el del bloque anterior) hasta que sea un entero positivo válido, y devolver ese valor con return.
Llama a la función un par de veces, con mensajes distintos, para pedir dos datos diferentes en el programa principal (por ejemplo, una edad y una cantidad de dinero).
💾 Haz un commit al terminar el ejercicio.
Ejercicio 9. Simulador de dados con parámetro
Escribe una función con la siguiente firma:
def lanzar_dado(caras=6)
Debe devolver un valor aleatorio entre 1 y caras, usando random.randint (recuerda escribir import random al principio del script).
Reutilízala para simular una tirada de un dado de 6 caras (sin argumento) y otra de un dado de 20 caras (lanzar_dado(20)), mostrando el resultado de cada una.
💾 Haz un commit al terminar el ejercicio.
Ejercicio 10. Calculadora de propina
Escribe una función con la siguiente firma:
def calcular_propina(cuenta, porcentaje=10, personas=1)
Debe devolver cuánto debe pagar cada persona, repartiendo a partes iguales el importe de la cuenta más la propina. Llama a la función varias veces con distintas combinaciones de argumentos con nombre para comprobar que los valores por defecto funcionan como esperas (por ejemplo, solo con cuenta, con cuenta y personas, o con los tres).
💾 Haz un commit al terminar el ejercicio.
Ejercicio 11. Recursividad
Escribe una función recursiva con la siguiente firma:
def factorial(n)
Y compárala con una versión iterativa, con la misma firma pero llamada factorial_iterativo:
def factorial_iterativo(n)
(usa un bucle for en la versión iterativa). Comprueba que ambas dan el mismo resultado para varios valores, y añade un comentario explicando cuál es el caso base de la versión recursiva.
💾 Haz un commit al terminar el ejercicio.
Ejercicio 12. Funciones internas y documentación
Escribe una función con la siguiente firma:
def resumen_numeros(a, b, c, d, e)
Debe recibir cinco números y devolver, a la vez, el mayor, el menor y la suma de sus valores absolutos. Apóyate en funciones internas (built-in) de Python que ya vienen incorporadas al lenguaje: max(), min() y abs(). Añade a la función un docstring de una línea explicando qué hace y qué devuelve. Llámala con cinco números de ejemplo (algunos negativos) y muestra el resultado.
💾 Haz un commit al terminar el ejercicio.
Ejercicio 13. Anota los tipos de una función
Escribe una función con la siguiente firma, usando anotaciones de tipos (type hints) tanto en el parámetro como en el valor de retorno:
def celsius_a_fahrenheit(grados: float) -> float
Debe convertir una temperatura de grados Celsius a Fahrenheit (grados * 9/5 + 32).
Llama a la función con un par de valores de ejemplo y muestra el resultado.
Comprueba que las anotaciones no cambian el comportamiento del programa: aunque llames a la función con un número entero en lugar de float (por ejemplo, celsius_a_fahrenheit(20)), el programa seguirá funcionando con normalidad, porque Python no comprueba los tipos en tiempo de ejecución.
💾 Haz un commit al terminar el ejercicio.
Ejercicio 14. Función con varios parámetros anotados y docstring
Escribe una función con la siguiente firma, con anotaciones de tipos en todos los parámetros y en el valor de retorno:
def calcular_precio_final(precio: float, cantidad: int, descuento: float = 0) -> float
Debe calcular el precio final de una compra: el precio unitario multiplicado por la cantidad, aplicando después el descuento indicado (en tanto por ciento) sobre ese total.
Añade también un docstring a la función explicando qué hace.
Llama a la función varias veces con distintas combinaciones de argumentos (con y sin descuento) y muestra el resultado de cada llamada.
💾 Haz un commit al terminar el ejercicio.
Al terminar los ejercicios, debes tener claro los siguientes conceptos:
- Funciones internas (built-in) de Python
- Definición de una función (
def) - Llamada a una función
- Parámetros y argumentos
- Parámetros con valor por defecto / argumentos con nombre
- Paso de argumentos a una función
- Ámbito de las variables (local vs. global)
- La sentencia
returny la devolución de valores - Flujo de ejecución al llamar a una función
- Recursividad y caso base
- Organización del código en funciones
- Documentación de funciones (docstrings)
- Anotación de tipos (type hints)