2013-11-24 2 views
0

UPDATE:Благодаря ответам ниже я теперь знаю, что это ошибка в функции и не имеет ничего общего с поведением Python. (Мой фол) Я с тех пор изменил название с «Может ли Python пропускать пробелы при повторении строки?» на «Что не так с этой функцией?» поэтому будущие читатели будут знать, что ответы, которые они найдут здесь, относятся к функции, а не к Python.Что не так с этой функцией Palindrome?

Я создал функцию на Python, которая определяет, является ли строка палиндром или нет. В принципе, он выполняет итерацию слева и справа одновременно и проверяет, не совпадают ли какие-либо символы. Если это так, он возвращает False. После того, как он достигнет середины, он прекратит итерацию и вернет True.

def isPalindrome(string): 
    l = 0 
    r = -1 
    while(l < r+2): 
     if string[l] != string[r]: 
      return False 
     l += 1 
     r -= 1 

    return True 

palin = raw_input("Enter string: ") 
if(isPalindrome(palin)): 
    print "\""+palin+"\"","is a Palindrome." 
else: 
    print "\""+palin+"\"","isn't a Palindrome." 

Он работает , но по какой-то причине он также определяет строки, как «pythonnoh ти р» как палиндром. Хотя иногда это может быть хорошо, мне интересно, почему функция пропускает пробелы в строке. Он должен возвращать False, так как '' не равен 'y', но это не так.

Есть ли проблема в моем коде или поведение Python?

+4

Вы только сравнить первую и последнюю букву. Также «pythonp» является палиндром в соответствии с вашей функцией. Ничего общего с пробелами. – Hyperboreus

ответ

4

После сравнения string[0] с string[-1] значения для l и r являются 1 и -2. Поскольку 1 < 0 не соответствует действительности, ваш цикл while заканчивается.

Попробуйте это:

def isPalindrome(s): return s == s[::-1] 

Если вы хотите игнорировать пробельные, вы можете продлить его немного:

def isPalindrome(s, ignoreSpaces = False): 
     if ignoreSpaces: 
       s = s.replace(' ', '') 
     return s == s[::-1] 

print (isPalindrome ('pythonnohtyp')) 
print (isPalindrome ('pythonnohtyp', True)) 
print (isPalindrome ('pythonnoh ty p')) 
print (isPalindrome ('pythonnoh ty p', True)) 
3

Кажется, что у вас есть проблема с вашим циклом while.

Я добавил оператору быстрого отладки и провел несколько тестов для вас, которые должны выявить проблему.

>>> def isPalindrome(string): 
    l = 0 
    r = -1 
    while(l < r+2): 
     if string[l] != string[r]: 
      return False 
     print "left: %s" %string[l] 
     print "right: %s" %string[r] 
     l += 1 
     r -= 1 

    return True 

>>> isPalindrome("ono") 
left: o 
right: o 
True 
>>> isPalindrome("on o") 
left: o 
right: o 
True 
>>> isPalindrome("palindrome") 
False 
>>> isPalindrome("palinilap") 
left: p 
right: p 
True 
>>> isPalindrome("palinalap") 
left: p 
right: p 
True 
Смежные вопросы