Revisión automática de la práctica 02-enumera
Este es el resultado de una revisión automática de la prácica 02-enumera, tal y como la hemos recogido de este repositorio de entrega. Por favor, ten en cuenta que al ser una revisión automática, realizada en parte con la ayuda de un asistente de inteligencia artificial generativa, puede incluir errores, y ser incorrecta. Pero leela con atención, porque creemos que puede tener información útil. Si tienes cualquier duda, o crees que la revisión es errónea, por favor, consulta con los profesores de la asignatura.
Comprobación de archivos
Archivos revisados:
-
enumeraciones.py: está en el repositorio
Prueba automática del programa
Pruebas realizadas por 02-control/enumera/test_enumeraciones.py:
OK
Revisión automática de programa
Programa revisado:
def pintalista(a):
for c in range(len(a)):
print(a[c], end = " ")
print()
while True:
try:
# Así me aseguro de que el usuario siempre introduzca numeros enteros mayores que 0
num = int(input("Escribe un número natural: "))
if num >= 1:
break
else:
print("Solo se pueden escribir números naturales")
except ValueError:
print("Solo se pueden escribir números naturales")
# Creo una lista que contiene los números impares
impares = [i for i in range(1, num + 1) if i % 2 != 0]
for _ in range(len(impares)):
pintalista(impares)
impares.pop()
# Creo una lista que contiene los números pares
pares = [i for i in range(2, num + 1) if i % 2 == 0]
for _ in range(len(pares)):
pintalista(pares)
pares.pop()
Análisis
Cumple con el enunciado
- Entrada: El programa solicita un número entero, verifica que sea mayor que 0 y vuelve a pedirlo si la entrada no es válida.
-
Salida – impares: Genera la lista de números impares ≤
numy, usando un bucle, la muestra completa, luego sin el último elemento y así sucesivamente hasta quedar solo el 1. El formato coincide con los ejemplos: cada línea contiene los números separados por un espacio. - Salida – pares: Hace lo propio con la lista de pares, mostrando la secuencia completa y reduciéndola hasta dejar solo el 2.
- Resultado: Para los casos de prueba (5 y 8) la salida coincides con lo que se espera. El único detalle menor es que la leyenda de entrada dice “Escribe un número natural: ” en lugar de “Dame un número entero mayor que 0: ”, pero eso no afecta la funcionalidad.
Es fácil de leer y entender
-
Ventajas:
- Usa nombres de variables descriptivos en español (
impares,pares,num). - La intención de cada bloque se entiende fácilmente (validar entrada, construir listas, imprimir).
- Usa nombres de variables descriptivos en español (
-
Posibles obstáculos para principiantes:
- La combinación
for _ in range(len(lista))ylista.pop()implica modificar la lista mientras se itera, lo que puede confundir a quien no ha visto aún la mutación de listas. - La función auxiliar
pintalistaaunque hace el código más corto, no ha sido vista en clase; un estudiante que no conozca funciones podría necesitarla explicada.
- La combinación
Sigue buenas prácticas de programación
-
Aspectos positivos:
- Validación de entrada con
try/excepty buclewhilepara garantizar un número > 0. - Uso de listas por comprensión para generar
imparesyparesde forma concisa.
- Validación de entrada con
-
Aspectos a mejorar:
-
Función sin docstring: La función
pintalistaes útil pero carece de documentación. - Mensaje de error repetido: La cadena “Solo se pueden escribir números naturales” se repite; podría extraerse a una constante.
-
Salida con espacios extra: El bucle interno
print(a[c], end=' ')añade un espacio tras el último número antes del salto de línea.print(*a)lo haría de forma más natural. -
Modificación de la lista:
pop()cambia la lista original; es más común y claro generar sub‑listas mediante slicing en cada iteración, sin alterar la lista fuente. - Prompt de entrada: Debería coincidir con la especificación del enunciado.
-
Función sin docstring: La función
Recomendaciones de mejora
-
Eliminar o simplificar la función auxiliar
- Como aún no se ha visto la definición de funciones, se puede reemplazar
pintalista(lista)porprint(*lista), que ya separa los elementos con espacios y añade el salto de línea automáticamente. - Si decides conservar la función, añade una breve docstring:
"""Imprime los elementos de *a* separados por espacio.""".
- Como aún no se ha visto la definición de funciones, se puede reemplazar
-
Usar slicing en lugar de
pop()- En lugar de modificar la lista con
pop(), genera y muestra cada sub‑lista mediante slicing:Lo mismo parafor i in range(len(impares), 0, -1): print(*impares[:i])pares. - Esta técnica evita la mutación de la lista y hace más evidente la progresión “de mayor a menor”.
- En lugar de modificar la lista con
-
Mejorar el mensaje de entrada
- Cambia la llamada a
inputa la frase exacta del enunciado:msg = "Dame un número entero mayor que 0: " while True: try: num = int(input(msg)) if num >= 1: break except ValueError: pass print("Solo se pueden escribir números naturales")
- Cambia la llamada a
-
Extraer la cadena de error a una constante
MENSAJE_ERROR = "Solo se pueden escribir números naturales"Así se evita la repetición y facilita futuras modificaciones.
-
Añadir comentarios explicativos
- Aunque el código sea claro, para principiantes es útil comentar cada paso:
# Genera la lista de números impares impares = [i for i in range(1, num + 1) if i % 2 != 0]
- Aunque el código sea claro, para principiantes es útil comentar cada paso:
-
Considerar el uso de
print(*lista)para evitar espacios finales-
print(*lista)produce exactamentea b c(sin espacio al final). Esto es más robusto que concatenar manualmenteend=' '.
-
-
Mantener la estructura de bucles sencilla
- Un bucle
for i in range(len(lista), 0, -1):es fácil de entender y es una forma estándar de recorrer una lista de mayor a menor.
- Un bucle
Con estos ajustes el programa seguirá cumpliendo la especificación, será más claro para quien lo lea por primera vez y eliminará pequeñas ineficiencias o ambigüedades.