Café y Código

9. Funciones: Tu Caja de Herramientas

¿Qué es una función?

Una función es un bloque de código con nombre que puedes ejecutar cada vez que lo necesites. En lugar de escribir el mismo código una y otra vez, lo encierras en una función y simplemente la llamas.

La estructura básica es siempre la misma:

estructura.py
PYTHON
1 def nombre_funcion(parametro1, parametro2):
2 # código que ejecuta la función
3 # ...
  • def — palabra clave que le dice a Python "esto es una función".
  • nombre_funcion — el nombre que tú eliges para llamarla después.
  • parametro1, parametro2 — datos que le puedes pasar (pueden ser 0 o más).
  • El cuerpo va indentado (4 espacios o un tab).

Funciones sin retorno

Una función sin retorno realiza una acción pero no devuelve ningún valor. Su trabajo es hacer algo: mostrar texto, guardar un archivo, enviar un mensaje… y listo.

El ejemplo más conocido es print(). Cuando escribes print("Hola"), Python muestra el texto en pantalla — eso es su "acción" — pero print() en sí no te entrega ningún valor de vuelta. Si intentas capturar su resultado, obtendrás None:

print_none.py
PYTHON
1 resultado = print("Hola mundo")
2 print(resultado) # None ← print no devuelve nada

Cuando tú creas una función sin escribir return, funciona exactamente igual:

sin_retorno.py
PYTHON
1 def mostrar_bienvenida(nombre):
2 print("---------------------------")
3 print(f" Bienvenido, {nombre}!")
4 print("---------------------------")
5
6 # Solo llamas la función — no hay valor de retorno
7 mostrar_bienvenida("Benjamín")
8 mostrar_bienvenida("Ana")
9 mostrar_bienvenida("Luis")

Salida:

salida
TEXT
1 ---------------------------
2 Bienvenido, Benjamín!
3 ---------------------------
4 ---------------------------
5 Bienvenido, Ana!
6 ---------------------------
7 ---------------------------
8 Bienvenido, Luis!
9 ---------------------------

Nota cómo llamamos la función tres veces sin repetir el código del recuadro. Eso es el principio DRY (Don't Repeat Yourself) en acción.

Funciones con retorno

Una función con retorno calcula o produce algo y te lo entrega de vuelta usando la palabra clave return. Puedes guardar ese valor en una variable o usarlo directamente.

Un ejemplo que ya conoces es input(). Esta función muestra un mensaje en pantalla y espera a que el usuario escriba algo. Cuando el usuario presiona Enter, input() te devuelve lo que escribió como texto (str):

input_ejemplo.py
PYTHON
1 nombre = input("¿Cuál es tu nombre? ")
2 # Aquí 'nombre' guarda el texto que el usuario escribió
3 print(f"Hola, {nombre}!")

Cuando tú creas una función con return, haces lo mismo:

con_retorno.py
PYTHON
1 def sumar(a, b):
2 resultado = a + b
3 return resultado # ← entregamos el valor
4
5 # Capturamos lo que devuelve la función
6 total = sumar(10, 5)
7 print(total) # 15
8
9 # También podemos usarlo directamente
10 print(sumar(3, 7)) # 10
11 print(sumar(100, 200)) # 300

Un ejemplo más completo que combina lógica dentro de la función:

descuentos.py
PYTHON
1 def calcular_descuento(precio, porcentaje):
2 descuento = precio * (porcentaje / 100)
3 precio_final = precio - descuento
4 return precio_final
5
6 zapatos = calcular_descuento(150, 20) # 20% de descuento
7 camisa = calcular_descuento(80, 10) # 10% de descuento
8
9 print(f"Zapatos: S/ {zapatos}") # Zapatos: S/ 120.0
10 print(f"Camisa: S/ {camisa}") # Camisa: S/ 72.0

Parámetros: valores por defecto y argumentos con nombre

Puedes darle a un parámetro un valor por defecto. Si el llamador no lo pasa, se usa ese valor automáticamente.

parametros.py
PYTHON
1 def saludar(nombre, mensaje="Bienvenido"):
2 return f"¡Hola {nombre}! {mensaje}"
3
4 print(saludar("Benjamín")) # usa el mensaje por defecto
5 print(saludar("Juan", "Gusto en verte")) # sobreescribe el mensaje
6 print(saludar(mensaje="¿Cómo estás?", nombre="Ana")) # argumentos con nombre (puedes cambiar el orden)

Funciones Lambda (Anónimas)

Para lógica muy corta que cabe en una línea, Python tiene las funciones lambda. Son útiles cuando necesitas una función rápida sin darle nombre formal.

lambda.py
PYTHON
1 # Función normal
2 def cuadrado(x):
3 return x * x
4
5 # La misma función como lambda
6 cuadrado = lambda x: x * x
7
8 print(cuadrado(5)) # 25
9 print(cuadrado(9)) # 81
10
11 # Lambda con dos parámetros
12 area = lambda base, altura: (base * altura) / 2
13 print(area(10, 4)) # 20.0

Ejemplo completo: Calculadora con menú

Aquí vemos cómo dividir un programa real en mini funciones, cada una con una sola responsabilidad. La función pedir_opcion() usa un while + try/except para repetir la pregunta si el usuario escribe algo incorrecto.

Paso 1 — Las operaciones (funciones con retorno):

calculadora.py — operaciones
PYTHON
1 def sumar(a, b):
2 return a + b
3
4 def restar(a, b):
5 return a - b
6
7 def multiplicar(a, b):
8 return a * b
9
10 def dividir(a, b):
11 if b == 0:
12 return "Error: no se puede dividir entre cero"
13 return a / b

Paso 2 — Función para mostrar el menú (sin retorno):

calculadora.py — menú
PYTHON
1 def mostrar_menu():
2 print("\n=== CALCULADORA ===")
3 print("1. Sumar")
4 print("2. Restar")
5 print("3. Multiplicar")
6 print("4. Dividir")
7 print("0. Salir")

Paso 3 — Función para pedir un número (con retorno + while + try/except):

Esta función es clave: usa un while True para seguir preguntando hasta que el usuario escriba un número válido. Si escribe texto o lo deja vacío, el except atrapa el error y vuelve a intentar.

calculadora.py — pedir número
PYTHON
1 def pedir_numero(mensaje):
2 while True:
3 try:
4 numero = float(input(mensaje))
5 return numero
6 except ValueError:
7 print(" ⚠ Eso no es un número. Intenta de nuevo.")

Paso 4 — Función para pedir la opción del menú (con retorno + while + try/except):

Igual que pedir_numero(), pero valida que la opción esté entre 0 y 4. Si el usuario escribe "abc" o "9", le avisa y repite.

calculadora.py — pedir opción
PYTHON
1 def pedir_opcion():
2 while True:
3 try:
4 opcion = int(input("\nElige una opción (0-4): "))
5 if opcion not in [0, 1, 2, 3, 4]:
6 print(" ⚠ Opción inválida. Elige entre 0 y 4.")
7 else:
8 return opcion
9 except ValueError:
10 print(" ⚠ Debes escribir un número, no letras.")

Paso 5 — El programa principal que une todo:

calculadora.py — main
PYTHON
1 def main():
2 while True:
3 mostrar_menu()
4 opcion = pedir_opcion()
5
6 if opcion == 0:
7 print("¡Hasta luego!")
8 break
9
10 a = pedir_numero("Primer número: ")
11 b = pedir_numero("Segundo número: ")
12
13 if opcion == 1:
14 resultado = sumar(a, b)
15 elif opcion == 2:
16 resultado = restar(a, b)
17 elif opcion == 3:
18 resultado = multiplicar(a, b)
19 elif opcion == 4:
20 resultado = dividir(a, b)
21
22 print(f"\n Resultado: {resultado}")
23
24 main()

Código completo junto:

calculadora.py — completo
PYTHON
1 # --- Operaciones ---
2 def sumar(a, b):
3 return a + b
4
5 def restar(a, b):
6 return a - b
7
8 def multiplicar(a, b):
9 return a * b
10
11 def dividir(a, b):
12 if b == 0:
13 return "Error: no se puede dividir entre cero"
14 return a / b
15
16 # --- Interfaz ---
17 def mostrar_menu():
18 print("\n=== CALCULADORA ===")
19 print("1. Sumar")
20 print("2. Restar")
21 print("3. Multiplicar")
22 print("4. Dividir")
23 print("0. Salir")
24
25 def pedir_numero(mensaje):
26 while True:
27 try:
28 numero = float(input(mensaje))
29 return numero
30 except ValueError:
31 print(" ⚠ Eso no es un número. Intenta de nuevo.")
32
33 def pedir_opcion():
34 while True:
35 try:
36 opcion = int(input("\nElige una opción (0-4): "))
37 if opcion not in [0, 1, 2, 3, 4]:
38 print(" ⚠ Opción inválida. Elige entre 0 y 4.")
39 else:
40 return opcion
41 except ValueError:
42 print(" ⚠ Debes escribir un número, no letras.")
43
44 # --- Programa principal ---
45 def main():
46 while True:
47 mostrar_menu()
48 opcion = pedir_opcion()
49
50 if opcion == 0:
51 print("¡Hasta luego!")
52 break
53
54 a = pedir_numero("Primer número: ")
55 b = pedir_numero("Segundo número: ")
56
57 if opcion == 1:
58 resultado = sumar(a, b)
59 elif opcion == 2:
60 resultado = restar(a, b)
61 elif opcion == 3:
62 resultado = multiplicar(a, b)
63 elif opcion == 4:
64 resultado = dividir(a, b)
65
66 print(f"\n Resultado: {resultado}")
67
68 main()

Ejemplo de ejecución con errores del usuario:

ejecución
TEXT
1 === CALCULADORA ===
2 1. Sumar
3 2. Restar
4 3. Multiplicar
5 4. Dividir
6 0. Salir
7
8 Elige una opción (0-4): abc
9 ⚠ Debes escribir un número, no letras.
10
11 Elige una opción (0-4): 9
12 ⚠ Opción inválida. Elige entre 0 y 4.
13
14 Elige una opción (0-4): 1
15 Primer número: hola
16 ⚠ Eso no es un número. Intenta de nuevo.
17 Primer número: 15
18 Segundo número: 7
19
20 Resultado: 22.0

Ejercicios prácticos

Ejercicio 1 — Multiplicar dos números

Crea una función multiplicar(a, b) que reciba dos números y retorne su producto.

👁️ Ver solución
solucion_1.py
PYTHON
1 def multiplicar(a, b):
2 return a * b
3
4 print(multiplicar(5, 4)) # 20
5 print(multiplicar(3, 7)) # 21

Ejercicio 2 — Calcular el área de un rectángulo

Crea una función area_rectangulo(base, altura) que retorne el área.

👁️ Ver solución
solucion_2.py
PYTHON
1 def area_rectangulo(base, altura):
2 return base * altura
3
4 print(area_rectangulo(5, 3)) # 15
5 print(area_rectangulo(10, 4)) # 40

Ejercicio 3 — Saludar con mayúsculas

Crea una función saludar(nombre) que imprima el nombre en mayúsculas dentro de un saludo. La función NO debe retornar nada.

👁️ Ver solución
solucion_3.py
PYTHON
1 def saludar(nombre):
2 print(f"¡HOLA, {nombre.upper()}!")
3
4 saludar("benjamín") # ¡HOLA, BENJAMÍN!
5 saludar("ana") # ¡HOLA, ANA!

Ejercicio 4 — ¿Es par o impar?

Crea una función es_par(numero) que retorne True si el número es par y False si es impar.

👁️ Ver solución
solucion_4.py
PYTHON
1 def es_par(numero):
2 return numero % 2 == 0
3
4 print(es_par(4)) # True
5 print(es_par(7)) # False
6 print(es_par(10)) # True

Ejercicio 5 — Mayor de dos números

Crea una función mayor(a, b) que retorne el número más grande de los dos.

👁️ Ver solución
solucion_5.py
PYTHON
1 def mayor(a, b):
2 if a > b:
3 return a
4 return b
5
6 print(mayor(10, 5)) # 10
7 print(mayor(3, 8)) # 8
8 print(mayor(7, 7)) # 7

Ejercicio 6 — Contar letras

Crea una función contar_letras(texto) que retorne cuántos caracteres tiene el texto (sin contar espacios).

👁️ Ver solución
solucion_6.py
PYTHON
1 def contar_letras(texto):
2 return len(texto.replace(" ", ""))
3
4 print(contar_letras("hola mundo")) # 9
5 print(contar_letras("Python")) # 6

Ejercicio 7 — Precio con IGV

Crea una función precio_con_igv(precio) que retorne el precio con 18% de IGV incluido. El parámetro igv debe tener valor por defecto de 0.18.

👁️ Ver solución
solucion_7.py
PYTHON
1 def precio_con_igv(precio, igv=0.18):
2 return precio * (1 + igv)
3
4 print(precio_con_igv(100)) # 118.0
5 print(precio_con_igv(200)) # 236.0
6 print(precio_con_igv(100, 0.10)) # 110.0 (con IGV diferente)

Ejercicio 8 — Imprimir tabla de multiplicar

Crea una función tabla(numero) que imprima la tabla de multiplicar del número del 1 al 10. La función no retorna nada.

👁️ Ver solución
solucion_8.py
PYTHON
1 def tabla(numero):
2 print(f"--- Tabla del {numero} ---")
3 for i in range(1, 11):
4 print(f"{numero} x {i} = {numero * i}")
5
6 tabla(5)
7 tabla(7)

Ejercicio 9 — Temperatura Celsius a Fahrenheit

Crea una función a_fahrenheit(celsius) que convierta grados Celsius a Fahrenheit. La fórmula es: (celsius * 9/5) + 32.

👁️ Ver solución
solucion_9.py
PYTHON
1 def a_fahrenheit(celsius):
2 return (celsius * 9 / 5) + 32
3
4 print(a_fahrenheit(0)) # 32.0 (punto de congelación)
5 print(a_fahrenheit(100)) # 212.0 (punto de ebullición)
6 print(a_fahrenheit(37)) # 98.6 (temperatura corporal)

Ejercicio 10 — Calculadora completa

Crea una función calcular(a, b, operacion) que reciba dos números y una operación ("sumar", "restar", "multiplicar", "dividir") y retorne el resultado. Si la operación no existe, retorna "Operación no válida".

👁️ Ver solución
solucion_10.py
PYTHON
1 def calcular(a, b, operacion):
2 if operacion == "sumar":
3 return a + b
4 elif operacion == "restar":
5 return a - b
6 elif operacion == "multiplicar":
7 return a * b
8 elif operacion == "dividir":
9 if b == 0:
10 return "No se puede dividir entre cero"
11 return a / b
12 else:
13 return "Operación no válida"
14
15 print(calcular(10, 5, "sumar")) # 15
16 print(calcular(10, 5, "restar")) # 5
17 print(calcular(10, 5, "multiplicar")) # 50
18 print(calcular(10, 5, "dividir")) # 2.0
19 print(calcular(10, 0, "dividir")) # No se puede dividir entre cero
20 print(calcular(10, 5, "potencia")) # Operación no válida

Prueba de Funciones

Dato curioso: Primera versión pública en 1991; Guido van Rossum. Wikipedia

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.