Determinar si la cadena es palíndromo

Escribí dos funciones simples para determinar si una cadena es un palíndromo. Pensé que eran equivalentes, pero 2 no funciona. ¿Por qué es esto?

1

def is_palindrome(string): if string == string[::-1]: return True else: return False 

2

 def is_palindrome(string): if string == reversed(string): return True else: return False 

reversed no crea una cadena sino un objeto ‘invertido’:

 >>> reversed('radar')  

Como tal, la cadena 'radar' no se compara igual al objeto reversed('radar') . Para que funcione, debe asegurarse de que el objeto reversed se evalúa realmente:

 def is_palindrome(string): if string == u''.join(reversed(string)): return True else: return False 

La u''.join(reversed(string)) inserta u'' entre cada uno de los caracteres de la cadena y esto hace que la cadena invertida se convierta en un objeto de cadena.

En el segundo, debe crear una str partir de la instancia de tipo reversed , no es difícil:

 if string == ''.join(reversed(string)): 

Para cuerdas:

 def is_palindrome(s): """Return True if a string is a palindrome.""" return s == s[::-1] 

Para iterables generales (incluyendo cadenas):

 def is_palindrome(iterable): """Return True if an iterable is a palindrome.""" if list(iteable) == list(reversed(iterable)) 
 str = input("Enter a string") print("\n".join(["Inserted string is" + "NOT"*((str[::-1])!=str)+ " a palindrome"]))