Revisión automática de la práctica 01-permutaciones
Este es el resultado de una revisión automática de la prácica 01-permutaciones, 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.
Revisión automática de programa
Programa revisado:
#permutaciones
lista = ['Hola', 'Qué tal', 'Adiós']
for i in range(len(lista)):
first = lista[i]
lista2 = lista.copy()
del(lista2[i])
print(first, lista2[0], lista2[1])
print(first, lista2[1], lista2[0])
Análisis
Cumple con el enunciado
El programa, tal como está escrito, produce exactamente la salida requerida para la lista de tres elementos ['Hola', 'Qué tal', 'Adiós'].
- Se inicia con las líneas que especifica el enunciado.
- Se imprimen las seis permutaciones, cada una en una línea y con los strings separados por espacios.
No obstante, el código está hardcodeado para listas de longitud 3: al imprimir usa los índices lista2[0] y lista2[1]. Si la lista tuviera cuatro o más elementos, el programa terminaría con un IndexError y, de hecho, ni siquiera genera las permutaciones correctas.
Es fácil de leer y entender
Para alguien que esté aprendiendo, la idea de “coger un elemento, eliminarlo del resto y luego imprimir los dos elementos restantes en los dos órdenes posibles” es relativamente clara. Sin embargo:
- La variable
lista2se crea mediantelista.copy()y luego se modifica condel(lista2[i]). Este proceso, aunque correcto, puede resultar confuso para un principiante, ya que no es evidente que lo que se busca es obtener la lista sin el elemento seleccionado. - El uso de índices literales (
lista2[0]ylista2[1]) disimula la lógica de permutación y hace que el código sea difícil de adaptar a listas de otro tamaño. - No hay comentarios ni docstrings que expliquen la intención de cada paso, lo que reduce la claridad.
Sigue buenas prácticas de programación
- Reutilización y generalidad: el programa solo funciona para listas de tamaño 3. No es reutilizable para listas de otra longitud, que es uno de los objetivos opcionales del enunciado.
-
Legibilidad y mantenimiento: falta de comentarios, nombres poco descriptivos (por ejemplo,
lista2yfirst) y la presencia de código “escrito a mano” con índices fijos dificultan la comprensión y futuras modificaciones. - Robustez: no se verifica la longitud de la lista antes de acceder a los índices, lo que puede provocar errores en tiempo de ejecución.
-
Estilo: se omite la verificación de
if __name__ == '__main__':y la separación entre lógica de generación de permutaciones y su impresión. -
Uso de librerías: el programa no utiliza
itertools, lo cual está bien para esta práctica, aunque se podría mencionar que para un programa real sí sería conveniente conocer la funciónitertools.permutations.
Recomendaciones de mejora
-
Generalizar la generación de permutaciones
- En lugar de imprimir manualmente los dos elementos restantes, utiliza bucles anidados o una función recursiva que permita generar permutaciones para cualquier número de elementos.
- Una versión con bucles anidados sería útil para el caso opcional de 4 elementos, mientras que una versión recursiva o la propia
itertools.permutationsmanejaría cualquier longitud.
-
Separar la lógica de generación de la lógica de impresión
- Crea una función (por ejemplo,
generar_permutaciones(lista)) que devuelva cada permutación como una lista o tupla de strings. - Luego, en la parte principal, itera sobre esas permutaciones y las imprime con
print(' '.join(perm)). Esto hace el código más modular y fácil de testear.
- Crea una función (por ejemplo,
-
Mejorar la claridad y la documentación
- Añade comentarios breves que expliquen por qué se copia la lista y se elimina el elemento actual.
- Incluye un docstring en la función que describa su propósito y parámetros.
-
Usar nombres de variable más descriptivos
- En lugar de
lista,lista2yfirst, podrías usarelementos,restoyprimer_elemento. Esto hace que el código sea autoexplicativo.
- En lugar de
-
Manejo seguro de índices
- Si decides mantener la versión “corta”, verifica que la lista tenga exactamente tres elementos antes de acceder a los índices 0 y 1.
- Como alternativa, cambia la lógica para que sea independiente del tamaño de la lista (p. ej., con bucles).
-
Añadir una estructura
if __name__ == '__main__'- Esto permite que el archivo se pueda importar sin ejecutar el código de demostración y es una buena práctica en Python.
-
(Opcional) Comentario sobre
itertools- Si decides usar
itertools.permutationsen una versión “real”, hazlo saber que para esta práctica el objetivo es trabajar con bucles y recursión, por lo que no debes usarlo todavía.
- Si decides usar
Siguiendo estas sugerencias, el programa будет:
- Correcto para cualquier longitud de lista,
- Más legible para quien lo lea, y
- Más mantenible, pues se separa la generación de permutaciones de su presentación.