def y el nombre
def calcular_iva la declara. El nombre debe decir
qué hace, y por eso casi siempre empieza por un verbo:
calcular_, leer_, validar_.
Una función es un trozo de código con nombre, que escribes una vez y usas cuantas veces quieras. Es lo que evita tener el mismo cálculo copiado en cinco sitios - y que al cambiar la regla se te olvide uno.
def calcular_iva(base):
"""Devuelve el valor del IVA (19%) de una base gravable."""
return base * 0.19
# Ahora se usa las veces que haga falta
print(calcular_iva(100000))
print(calcular_iva(250000))19000.0 47500.0
def calcular_iva la declara. El nombre debe decir
qué hace, y por eso casi siempre empieza por un verbo:
calcular_, leer_, validar_.
Lo que va entre paréntesis: los datos que la función necesita para trabajar. Dentro de ella se usan como variables normales.
El texto entre triples comillas de la primera línea. Explica qué hace y qué devuelve. No es adorno: es lo que verá quien use tu función dentro de seis meses, y ese suele ser tú.
Lo que la función devuelve a quien la llamó.
⚠️ Sin return, la función devuelve None, y el
cálculo se pierde aunque lo haya hecho bien.
La confusión clásica: print no es
return. print() muestra algo en pantalla y
desaparece; return entrega el valor para poder seguir operando con
él. Una función que solo imprime no sirve para calcular un total: el número se vio,
pero nadie lo tiene.
Junta todo el curso: variables, operadores, condicionales, ciclos, listas, diccionarios y funciones. Es un programa que un negocio real podría usar mañana.
Escríbelo en un archivo reporte.py y ejecútalo.
# Reporte de ventas del dia
IVA = 0.19
META_DIARIA = 500000
DESCUENTO_MAXIMO = 0.30 # tope permitido, se valida abajo
ventas = [
{"producto": "Teclado", "cantidad": 2, "valor": 189000, "descuento": 0.05},
{"producto": "Mouse", "cantidad": 5, "valor": 45000, "descuento": 0.00},
{"producto": "Monitor", "cantidad": 1, "valor": 890000, "descuento": 0.10},
{"producto": "Cable", "cantidad": 8, "valor": 12000, "descuento": 0.50},
]
def validar_descuento(pct):
"""Recorta el descuento al tope permitido. Devuelve el porcentaje aplicable."""
if pct > DESCUENTO_MAXIMO:
return DESCUENTO_MAXIMO
return pct
def calcular_linea(venta):
"""Calcula el total de una venta, con descuento validado e IVA."""
bruto = venta["cantidad"] * venta["valor"]
pct = validar_descuento(venta["descuento"])
base = bruto - (bruto * pct)
return base + (base * IVA)
def imprimir_reporte(ventas):
"""Imprime el detalle linea por linea y devuelve el total del dia."""
total = 0
print("REPORTE DE VENTAS")
print("-" * 46)
for i, venta in enumerate(ventas, 1):
linea = calcular_linea(venta)
total += linea
aviso = ""
if venta["descuento"] > DESCUENTO_MAXIMO:
aviso = " <-- descuento recortado al tope"
print(i, venta["producto"], "->", round(linea), aviso)
print("-" * 46)
return total
total_dia = imprimir_reporte(ventas)
print("TOTAL DEL DIA:", round(total_dia))
print("META DIARIA: ", META_DIARIA)
if total_dia >= META_DIARIA:
print("Meta CUMPLIDA. Excedente:", round(total_dia - META_DIARIA))
else:
print("Faltaron:", round(META_DIARIA - total_dia))REPORTE DE VENTAS ---------------------------------------------- 1 Teclado -> 427329 2 Mouse -> 267750 3 Monitor -> 953190 4 Cable -> 79968 <-- descuento recortado al tope ---------------------------------------------- TOTAL DEL DIA: 1728237 META DIARIA: 500000 Meta CUMPLIDA. Excedente: 1228237
Fíjate en la cuarta línea. El Cable traía un descuento del
50%, pero el tope de la empresa es 30%: validar_descuento()
lo recortó y el reporte lo avisó.
Esa comprobación no es un detalle del ejercicio. Una regla que existe pero no se comprueba en el código, no existe. Es la causa de fraudes reales: un tope de descuento configurado y nunca validado permite vender por $100 lo que cuesta $22.000, con una sola operación.
La que haces cada semana y te quita media hora. No empieces por la más importante: empieza por la más repetitiva.
Antes de tocar el teclado. Si no puedes escribirlos como una lista clara, todavía no está lista para automatizar.
La lista ventas de arriba es la tuya, con tus
columnas. Empieza escribiendo cinco registros a mano; leerlos desde Excel
es el paso siguiente.
Corre el script sobre datos de un mes cerrado y comprueba que da el mismo número que sacaste a mano. Un programa que no se verificó contra algo conocido no está terminado.
Siempre. El archivo original se deja intacto hasta que confíes en el script.
Responde mentalmente y haz clic para comprobar.
Es el paso natural: hasta aquí los datos estaban escritos en el
código. Con openpyxl y pandas se leen archivos
reales, y ahí el ahorro de tiempo se multiplica.
Los datos reales llegan sucios: acentos rotos por una importación mal codificada, la misma ciudad escrita de ocho formas, duplicados, campos con basura. Detectarlo y corregirlo es la habilidad más demandada, y es el contenido del curso intermedio.
try / except para que el programa no se caiga
cuando alguien escribe letras donde iban números, o el archivo no está
donde debía.
Un script que hay que ejecutar a mano sigue dependiendo de que alguien se acuerde. Programarlo para que corra cada día a una hora es lo que lo convierte en automatización de verdad.
¿Qué devuelve una función que no tiene return?
El tope de descuento está en una constante pero ninguna función lo comprueba. ¿Qué pasa?
¿Cuándo está terminado un script que automatiza una tarea?
Empezaste sin haber programado nunca y terminas con un programa que calcula, decide, valida una regla de negocio y produce un reporte. Ya sabes automatizar una tarea.
El salto siguiente es el que hacen las empresas: pasar de automatizar una tarea a automatizar un proceso completo - ventas, inventario, cartera, nómina, facturación electrónica. En Monarca Computer llevamos años haciendo exactamente eso para empresas colombianas.
Terminaste Python básico. Presenta la evaluación y reclama tu certificado.
Quiero mi certificado ← Listas y diccionarios