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
1def 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
1resultado = print("Hola mundo")
2print(resultado) # None ← print no devuelve nada

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

sin_retorno.py
PYTHON
1def mostrar_bienvenida(nombre):
2 print("---------------------------")
3 print(f" Bienvenido, {nombre}!")
4 print("---------------------------")
5
6# Solo llamas la función — no hay valor de retorno
7mostrar_bienvenida("Benjamín")
8mostrar_bienvenida("Ana")
9mostrar_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 vueltausando 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
1nombre = input("¿Cuál es tu nombre? ")
2# Aquí 'nombre' guarda el texto que el usuario escribió
3print(f"Hola, {nombre}!")

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

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

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

descuentos.py
PYTHON
1def calcular_descuento(precio, porcentaje):
2 descuento = precio * (porcentaje / 100)
3 precio_final = precio - descuento
4 return precio_final
5
6zapatos = calcular_descuento(150, 20) # 20% de descuento
7camisa = calcular_descuento(80, 10) # 10% de descuento
8
9print(f"Zapatos: S/ {zapatos}") # Zapatos: S/ 120.0
10print(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
1def saludar(nombre, mensaje="Bienvenido"):
2 return f"¡Hola {nombre}! {mensaje}"
3
4print(saludar("Benjamín")) # usa el mensaje por defecto
5print(saludar("Juan", "Gusto en verte")) # sobreescribe el mensaje
6print(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
2def cuadrado(x):
3 return x * x
4
5# La misma función como lambda
6cuadrado = lambda x: x * x
7
8print(cuadrado(5)) # 25
9print(cuadrado(9)) # 81
10
11# Lambda con dos parámetros
12area = lambda base, altura: (base * altura) / 2
13print(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
1def sumar(a, b):
2 return a + b
3
4def restar(a, b):
5 return a - b
6
7def multiplicar(a, b):
8 return a * b
9
10def 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
1def 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
1def 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
1def 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
1def 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
24main()

Código completo junto:

calculadora.py — completo
PYTHON
1# --- Operaciones ---
2def sumar(a, b):
3 return a + b
4
5def restar(a, b):
6 return a - b
7
8def multiplicar(a, b):
9 return a * b
10
11def dividir(a, b):
12 if b == 0:
13 return "Error: no se puede dividir entre cero"
14 return a / b
15
16# --- Interfaz ---
17def 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
25def 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
33def 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 ---
45def 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
68main()

Ejemplo de ejecución con errores del usuario:

ejecución
TEXT
1=== CALCULADORA ===
21. Sumar
32. Restar
43. Multiplicar
54. Dividir
60. Salir
7
8Elige una opción (0-4): abc
9 ⚠ Debes escribir un número, no letras.
10
11Elige una opción (0-4): 9
12 ⚠ Opción inválida. Elige entre 0 y 4.
13
14Elige una opción (0-4): 1
15Primer número: hola
16 ⚠ Eso no es un número. Intenta de nuevo.
17Primer número: 15
18Segundo 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
1def multiplicar(a, b):
2 return a * b
3
4print(multiplicar(5, 4)) # 20
5print(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
1def area_rectangulo(base, altura):
2 return base * altura
3
4print(area_rectangulo(5, 3)) # 15
5print(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
1def saludar(nombre):
2 print(f"¡HOLA, {nombre.upper()}!")
3
4saludar("benjamín") # ¡HOLA, BENJAMÍN!
5saludar("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
1def es_par(numero):
2 return numero % 2 == 0
3
4print(es_par(4)) # True
5print(es_par(7)) # False
6print(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
1def mayor(a, b):
2 if a > b:
3 return a
4 return b
5
6print(mayor(10, 5)) # 10
7print(mayor(3, 8)) # 8
8print(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
1def contar_letras(texto):
2 return len(texto.replace(" ", ""))
3
4print(contar_letras("hola mundo")) # 9
5print(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
1def precio_con_igv(precio, igv=0.18):
2 return precio * (1 + igv)
3
4print(precio_con_igv(100)) # 118.0
5print(precio_con_igv(200)) # 236.0
6print(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
1def tabla(numero):
2 print(f"--- Tabla del {numero} ---")
3 for i in range(1, 11):
4 print(f"{numero} x {i} = {numero * i}")
5
6tabla(5)
7tabla(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
1def a_fahrenheit(celsius):
2 return (celsius * 9 / 5) + 32
3
4print(a_fahrenheit(0)) # 32.0 (punto de congelación)
5print(a_fahrenheit(100)) # 212.0 (punto de ebullición)
6print(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
1def 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
15print(calcular(10, 5, "sumar")) # 15
16print(calcular(10, 5, "restar")) # 5
17print(calcular(10, 5, "multiplicar")) # 50
18print(calcular(10, 5, "dividir")) # 2.0
19print(calcular(10, 0, "dividir")) # No se puede dividir entre cero
20print(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.