Llegamos al final de esta primera ruta de aprendizaje de Python. Hasta ahora trabajamos variables, tipos de datos, condicionales, ciclos, listas, funciones, búsqueda y ordenamiento.
En este proyecto vamos a combinar todos esos conceptos en un programa completo: un sistema de gestión de alumnos que permite cargar estudiantes, registrar notas, calcular promedios, buscar, ordenar y obtener estadísticas.
Objetivo: dejar de resolver ejercicios aislados y empezar a pensar un programa como un conjunto de responsabilidades que trabajan entre sí.
¿Qué va a permitir hacer el sistema?
- agregar alumnos;
- cargar varias notas por alumno;
- listar todos los alumnos;
- calcular el promedio individual;
- buscar un alumno por nombre;
- ordenar alumnos por promedio;
- mostrar el mejor y el peor promedio;
- contar aprobados y desaprobados;
- utilizar un menú interactivo;
- organizar la lógica mediante funciones.
Cómo vamos a guardar los datos
Utilizaremos una lista llamada alumnos. Cada alumno estará representado por un diccionario.
alumnos = [
{
"nombre": "Ana",
"notas": [8, 7, 9]
},
{
"nombre": "Luis",
"notas": [5, 6, 7]
},
{
"nombre": "Maria",
"notas": [9, 8, 10]
},
{
"nombre": "Pedro",
"notas": [4, 5, 6]
},
{
"nombre": "Sofia",
"notas": [7, 7, 8]
},
{
"nombre": "Carlos",
"notas": [3, 5, 4]
}
]
Un diccionario nos permite asociar nombres de campos con valores. En este caso cada alumno tiene un nombre y una lista de notas.
No necesitamos dominar todavía todos los detalles de los diccionarios. En este proyecto los usamos simplemente como una forma clara de mantener juntos los datos que pertenecen a una misma persona.
1. Función para calcular el promedio
def calcular_promedio(notas): if len(notas) == 0: return 0 suma = 0 for nota in notas: suma += nota return suma / len(notas)
Esta función recibe una lista de notas y devuelve el promedio.
2. Buscar un alumno por nombre
def buscar_alumno(alumnos, nombre): for alumno in alumnos: if alumno["nombre"].lower() == nombre.lower(): return alumno return None
Utilizamos lower() para que la búsqueda no dependa de mayúsculas o minúsculas.
Si el alumno no existe, devolvemos None.
3. Agregar un alumno
def agregar_alumno(alumnos): nombre = input("Nombre del alumno: ").strip() if nombre == "": print("El nombre no puede estar vacio") return if buscar_alumno(alumnos, nombre) is not None: print("El alumno ya existe") return notas = [] cantidad = int(input("Cuantas notas desea cargar: ")) for i in range(cantidad): nota = float(input("Ingrese la nota " + str(i + 1) + ": ")) notas.append(nota) alumno = { "nombre": nombre, "notas": notas } alumnos.append(alumno) print("Alumno agregado correctamente")
Aquí combinamos entrada de datos, condicionales, ciclos, listas y funciones.
4. Listar alumnos
def listar_alumnos(alumnos): if len(alumnos) == 0: print("No hay alumnos cargados") return print("") print("=== LISTADO DE ALUMNOS ===") for alumno in alumnos: promedio = calcular_promedio(alumno["notas"]) print("Nombre:", alumno["nombre"]) print("Notas:", alumno["notas"]) print("Promedio:", round(promedio, 2)) print("------------------------")
round(promedio, 2) permite mostrar el promedio con dos decimales.
5. Buscar y mostrar un alumno
def mostrar_alumno(alumnos): nombre = input("Nombre a buscar: ") alumno = buscar_alumno(alumnos, nombre) if alumno is None: print("Alumno no encontrado") return promedio = calcular_promedio(alumno["notas"]) print("Nombre:", alumno["nombre"]) print("Notas:", alumno["notas"]) print("Promedio:", round(promedio, 2))
6. Ordenar alumnos por promedio
Podemos ordenar utilizando sorted() y una función auxiliar.
def promedio_alumno(alumno): return calcular_promedio(alumno["notas"]) def listar_por_promedio(alumnos): ordenados = sorted( alumnos, key=promedio_alumno, reverse=True ) print("") print("=== ALUMNOS POR PROMEDIO ===") for alumno in ordenados: promedio = calcular_promedio(alumno["notas"]) print( alumno["nombre"], "- Promedio:", round(promedio, 2) )
reverse=True hace que los promedios más altos aparezcan primero.
7. Mostrar mejor y peor promedio
def mostrar_extremos(alumnos): if len(alumnos) == 0: print("No hay alumnos cargados") return mejor = alumnos[0] peor = alumnos[0] for alumno in alumnos: if calcular_promedio(alumno["notas"]) > calcular_promedio(mejor["notas"]): mejor = alumno if calcular_promedio(alumno["notas"]) < calcular_promedio(peor["notas"]): peor = alumno print( "Mejor promedio:", mejor["nombre"], round(calcular_promedio(mejor["notas"]), 2) ) print( "Peor promedio:", peor["nombre"], round(calcular_promedio(peor["notas"]), 2) )
8. Contar aprobados y desaprobados
Para este ejemplo consideraremos aprobado un promedio mayor o igual a 6.
def mostrar_estadisticas(alumnos): if len(alumnos) == 0: print("No hay alumnos cargados") return aprobados = 0 desaprobados = 0 for alumno in alumnos: promedio = calcular_promedio(alumno["notas"]) if promedio >= 6: aprobados += 1 else: desaprobados += 1 print("Cantidad de alumnos:", len(alumnos)) print("Aprobados:", aprobados) print("Desaprobados:", desaprobados)
9. Crear el menú principal
def mostrar_menu(): print("") print("=== SISTEMA DE ALUMNOS ===") print("1. Agregar alumno") print("2. Listar alumnos") print("3. Buscar alumno") print("4. Ordenar por promedio") print("5. Mejor y peor promedio") print("6. Estadisticas") print("7. Salir")
Código completo del proyecto
Ahora reunimos todas las funciones en un único programa.
def calcular_promedio(notas): if len(notas) == 0: return 0 suma = 0 for nota in notas: suma += nota return suma / len(notas) def buscar_alumno(alumnos, nombre): for alumno in alumnos: if alumno["nombre"].lower() == nombre.lower(): return alumno return None def agregar_alumno(alumnos): nombre = input("Nombre del alumno: ").strip() if nombre == "": print("El nombre no puede estar vacio") return if buscar_alumno(alumnos, nombre) is not None: print("El alumno ya existe") return notas = [] cantidad = int(input("Cuantas notas desea cargar: ")) for i in range(cantidad): nota = float(input("Ingrese la nota " + str(i + 1) + ": ")) notas.append(nota) alumno = { "nombre": nombre, "notas": notas } alumnos.append(alumno) print("Alumno agregado correctamente") def listar_alumnos(alumnos): if len(alumnos) == 0: print("No hay alumnos cargados") return print("") print("=== LISTADO DE ALUMNOS ===") for alumno in alumnos: promedio = calcular_promedio(alumno["notas"]) print("Nombre:", alumno["nombre"]) print("Notas:", alumno["notas"]) print("Promedio:", round(promedio, 2)) print("------------------------") def mostrar_alumno(alumnos): nombre = input("Nombre a buscar: ") alumno = buscar_alumno(alumnos, nombre) if alumno is None: print("Alumno no encontrado") return promedio = calcular_promedio(alumno["notas"]) print("Nombre:", alumno["nombre"]) print("Notas:", alumno["notas"]) print("Promedio:", round(promedio, 2)) def promedio_alumno(alumno): return calcular_promedio(alumno["notas"]) def listar_por_promedio(alumnos): if len(alumnos) == 0: print("No hay alumnos cargados") return ordenados = sorted( alumnos, key=promedio_alumno, reverse=True ) print("") print("=== ALUMNOS POR PROMEDIO ===") for alumno in ordenados: promedio = calcular_promedio(alumno["notas"]) print( alumno["nombre"], "- Promedio:", round(promedio, 2) ) def mostrar_extremos(alumnos): if len(alumnos) == 0: print("No hay alumnos cargados") return mejor = alumnos[0] peor = alumnos[0] for alumno in alumnos: promedio = calcular_promedio(alumno["notas"]) promedio_mejor = calcular_promedio(mejor["notas"]) promedio_peor = calcular_promedio(peor["notas"]) if promedio > promedio_mejor: mejor = alumno if promedio < promedio_peor: peor = alumno print( "Mejor promedio:", mejor["nombre"], round(calcular_promedio(mejor["notas"]), 2) ) print( "Peor promedio:", peor["nombre"], round(calcular_promedio(peor["notas"]), 2) ) def mostrar_estadisticas(alumnos): if len(alumnos) == 0: print("No hay alumnos cargados") return aprobados = 0 desaprobados = 0 for alumno in alumnos: promedio = calcular_promedio(alumno["notas"]) if promedio >= 6: aprobados += 1 else: desaprobados += 1 print("Cantidad de alumnos:", len(alumnos)) print("Aprobados:", aprobados) print("Desaprobados:", desaprobados) def mostrar_menu(): print("") print("=== SISTEMA DE ALUMNOS ===") print("1. Agregar alumno") print("2. Listar alumnos") print("3. Buscar alumno") print("4. Ordenar por promedio") print("5. Mejor y peor promedio") print("6. Estadisticas") print("7. Salir") alumnos = [] opcion = 0 while opcion != 7: mostrar_menu() opcion = int(input("Seleccione una opcion: ")) if opcion == 1: agregar_alumno(alumnos) elif opcion == 2: listar_alumnos(alumnos) elif opcion == 3: mostrar_alumno(alumnos) elif opcion == 4: listar_por_promedio(alumnos) elif opcion == 5: mostrar_extremos(alumnos) elif opcion == 6: mostrar_estadisticas(alumnos) elif opcion == 7: print("Programa finalizado") else: print("Opcion invalida")
Cómo funciona el programa
El flujo principal es sencillo:
- creamos una lista vacía llamada
alumnos; - mostramos el menú;
- el usuario selecciona una opción;
- cada opción llama a una función específica;
- las funciones trabajan sobre la misma lista de alumnos;
- el menú se repite hasta elegir la opción de salida.
Qué conceptos estamos utilizando
Este proyecto combina prácticamente todos los fundamentos vistos en la serie:
- tipos de datos: cadenas, enteros, decimales y valores lógicos;
- condicionales: decisiones mediante
if,elifyelse; - ciclos:
forywhile; - listas: para almacenar alumnos y notas;
- funciones: para separar responsabilidades;
- búsqueda: para localizar alumnos;
- ordenamiento: para mostrar alumnos según promedio;
- None: para representar una búsqueda sin resultado;
- modularización: para evitar tener toda la lógica mezclada.
Pruebas que conviene realizar
Antes de considerar terminado un programa, conviene probar distintos escenarios.
- agregar varios alumnos;
- buscar un alumno existente;
- buscar uno que no existe;
- intentar cargar un nombre repetido;
- listar con la base vacía;
- ordenar varios promedios;
- probar alumnos aprobados y desaprobados;
- comprobar el mejor y peor promedio;
- ingresar una opción de menú inválida.
Mejoras posibles
El proyecto puede seguir creciendo. Algunas ideas:
- validar que las notas estén dentro de un rango determinado;
- permitir modificar las notas de un alumno;
- eliminar alumnos;
- guardar más datos, como documento o curso;
- mostrar el promedio general del curso;
- agregar cantidad de materias aprobadas;
- guardar la información en un archivo;
- recuperar los datos al iniciar el programa;
- crear una interfaz gráfica;
- guardar los alumnos en una base de datos.
Un paso importante: los datos todavía no son permanentes
En esta versión toda la información vive en memoria. Cuando cerramos el programa, la lista de alumnos desaparece.
Esto no es un error: para esta etapa nos permite concentrarnos en la lógica.
Más adelante podemos aprender a guardar información en archivos o bases de datos para que los datos continúen disponibles entre distintas ejecuciones.
Errores comunes en un proyecto de este tipo
- escribir toda la lógica dentro del
whileprincipal; - repetir código que podría estar en una función;
- confundir mostrar un dato con devolverlo mediante
return; - no controlar listas vacías antes de acceder a la primera posición;
- olvidar que las posiciones de las listas comienzan en 0;
- no contemplar búsquedas sin resultado;
- mezclar demasiadas responsabilidades dentro de una única función.
Qué aprendiste en esta serie de Python
Si llegaste hasta este proyecto, ya recorriste una base muy importante del lenguaje.
Durante esta serie trabajamos:
- instalación y primeros pasos con Python;
- el paso desde PSeInt hacia código real;
- tipos de datos y conversiones;
- condicionales y ciclos;
- listas;
- funciones;
- búsquedas;
- ordenamientos;
- organización de programas;
- un proyecto completo que integra todos esos conceptos.
El objetivo no es memorizar cada instrucción. Lo importante es aprender a analizar un problema, dividirlo en partes y convertir cada parte en instrucciones que la computadora pueda ejecutar.
¿Qué sigue después?
Con esta base ya podemos avanzar hacia temas como diccionarios en profundidad, archivos, manejo de errores, programación orientada a objetos, módulos, bases de datos y desarrollo de aplicaciones más completas.
También podemos aplicar la misma lógica aprendida acá a otros lenguajes como JavaScript, C, Java o C#.
Repasá toda la ruta de Python
Este proyecto integra los temas desarrollados a lo largo de toda la serie. Si querés repasar algún punto, podés volver directamente a cada guía:
- Introducción a Python: instalación y primeros pasos
- De PSeInt a Python: 10 algoritmos traducidos paso a paso
- 20 ejercicios resueltos de Python para principiantes
- Tipos de datos en Python
- Condicionales y ciclos en Python
- Listas en Python
- Funciones en Python
- Algoritmos de búsqueda y ordenamiento en Python
Ver el centro de contenidos de Python →
¿Te sirvió esta serie? ☕
Si estas guías te ayudaron a aprender programación, podés apoyar a Club Programador. Cada aporte ayuda a mantener el sitio online y a seguir publicando material gratuito.
🇦🇷 Apoyar desde Argentina
☕ Invitame un café con Mercado Pago
🌎 Apoyar desde otro país
Descubre más desde Club Programador
Suscríbete y recibe las últimas entradas en tu correo electrónico.
Un comentario en “Proyecto final en Python: sistema de gestión de alumnos paso a paso”