Skip to content

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 ≤ num y, 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).
  • Posibles obstáculos para principiantes:
    • La combinación for _ in range(len(lista)) y lista.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 pintalista aunque hace el código más corto, no ha sido vista en clase; un estudiante que no conozca funciones podría necesitarla explicada.

Sigue buenas prácticas de programación

  • Aspectos positivos:
    • Validación de entrada con try/except y bucle while para garantizar un número > 0.
    • Uso de listas por comprensión para generar impares y pares de forma concisa.
  • Aspectos a mejorar:
    • Función sin docstring: La función pintalista es ú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.

Recomendaciones de mejora

  1. Eliminar o simplificar la función auxiliar

    • Como aún no se ha visto la definición de funciones, se puede reemplazar pintalista(lista) por print(*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.""".
  2. Usar slicing en lugar de pop()

    • En lugar de modificar la lista con pop(), genera y muestra cada sub‑lista mediante slicing:
      for i in range(len(impares), 0, -1):
          print(*impares[:i])
      Lo mismo para pares.
    • Esta técnica evita la mutación de la lista y hace más evidente la progresión “de mayor a menor”.
  3. Mejorar el mensaje de entrada

    • Cambia la llamada a input a 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")
  4. 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.

  5. 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]
  6. Considerar el uso de print(*lista) para evitar espacios finales

    • print(*lista) produce exactamente a b c (sin espacio al final). Esto es más robusto que concatenar manualmente end=' '.
  7. 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.

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.