Revisión automática de la práctica 06-palindromo
Este es el resultado de una revisión automática de la prácica 06-palindromo, 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 con extension '.py'
- Comprobación con ficheros de solución
- Prueba automática del programa
- Revisión automática de programa
- Análisis
- Recomendaciones de mejora
Comprobación de archivos con extension '.py'
- Archivos Python excluidos de la búsqueda:
- Archivos Python encontrados (excluyendo esos): palindromo.py
Correcto, se elige palindromo.py como entrega.
Comprobación con ficheros de solución
Los archivos son diferentes de los de la solución.
Prueba automática del programa
Pruebas realizadas por 06-palindromo/tests/test_palindromo.py:
OK
Pruebas realizadas por 06-palindromo/tests/test_program.py:
OK
Revisión automática de programa
Programa revisado:
import sys
def palindromo(texto: str) -> bool:
"""
Determina si el texto es un palíndromo.
:param texto: Cadena de caracteres a evaluar, en minúsculas y sin
caracteres no alfabéticos
:returns: True si es palíndromo, False en caso contrario
"""
if len(texto) <= 1: # Si texto tiene 0 o 1 argumentos, la función
# devuelve True, ya que una cadena vacía o de un solo carácter
# se considera palíndromo
return True
if texto[0] != texto[-1]: # texto[0] obtiene el primer carácter de
# la cadena y texto[-1] obtiene el último
# si el primer y el último carácter no coinciden, la cadena no
# puede ser palíndromo y devolvemos False
return False
if texto[0] == texto[-1]:
return palindromo(texto[1:-1])
# Si los caracteres del inicio y final coinciden, se corta la
# palabra quitando esos extremos y se vuelve a evaluar lo que
# queda.
def main():
if len(sys.argv) != 2:
print('Uso correcto: python3 palindromo.py "cadena_a_evaluar"')
return
cadena = sys.argv[1] # Almacena en cadena el texto metido por el
# usuario desde la terminal
procesada = ''.join(c.lower() for c in cadena if c.isalpha())
# convierte cada letra a minúscula y solo conserva letras
# (elimina espacios, números, signos, etc.).
if palindromo(procesada):
print("Es palíndromo")
else:
print("No es palíndromo")
if __name__ == "__main__":
main()
Análisis
Cumple con el enunciado
El programa cumple con los requisitos del enunciado. La función palindromo es puramente recursiva (sin bucles), maneja correctamente el caso base para cadenas vacías o de un carácter, y reduce el problema en cada llamada eliminando el primer y último carácter. El preprocesamiento convierte a minúsculas y elimina caracteres no alfabéticos antes de llamar a la función recursiva. Los ejemplos proporcionados en el enunciado ("Anita lava la tina.", "¡Reconocer!", etc.) funcionarían correctamente. La estructura del programa incluye main() y el bloque if __name__ == "__main__".
Es fácil de leer y entender
El código es comprensible para un principiante. Los comentarios explican cada paso de forma clara, aunque en algunos casos son redundantes (como repetir la lógica en la función recursiva). Los nombres de variables (procesada, texto) son descriptivos y el flujo lógico sigue el esquema esperado para un problema recursivo. La separación entre preprocesamiento y lógica recursiva ayuda a entender las responsabilidades de cada parte.
Sigue buenas prácticas de programación
El programa tiene buenas prácticas como:
- Documentación clara en la función
palindromo. - Validación de argumentos en
main(). - Separación de responsabilidades (preprocesamiento vs. lógica recursiva).
Pero presenta dos errores menores:
- En la función recursiva, hay una condición redundante: después de verificar
texto[0] != texto[-1], no es necesario comprobartexto[0] == texto[-1]porque es el único caso restante. - En el docstring de
palindromo, se menciona "0 o 1 argumentos" cuando debería decir "caracteres".
Recomendaciones de mejora
-
Simplifica la lógica recursiva: Elimina la tercera condición (
if texto[0] == texto[-1]) y usa directamentereturn palindromo(texto[1:-1])después de las primeras verificaciones. Esto evita redundancia y mejora la claridad:if len(texto) <= 1: return True if texto[0] != texto[-1]: return False return palindromo(texto[1:-1]) - Corrige el docstring: Cambia "0 o 1 argumentos" por "0 o 1 caracteres" para ser preciso.
-
Reduce comentarios redundantes: En la función recursiva, el comentario sobre
texto[0] == texto[-1]no es necesario si la lógica se simplifica como se sugiere en el punto 1. Los comentarios deben explicar por qué, no qué hace el código.