Python 为什么不';这不是回文测试吗?

Python 为什么不';这不是回文测试吗?,python,Python,回文是向前和向后读取相同内容的字符串。回文的例子包括“lol”、“abba”、“radar”和“pickle elkcip”。指出它是否在以下docstring中描述的所有情况下都有效:“如果字符串s是回文,则返回True,否则返回False。” 我不明白为什么这个函数不起作用。在我看来,这项功能似乎有效。显然,布尔值被误用了,但我不明白上面的布尔值是如何被正确使用的。有人能给我解释一下吗?你总是检查每个字符。您需要在明确知道结果后立即返回。循环体的编码方式,pal的值可能会在True和Fals

回文是向前和向后读取相同内容的字符串。回文的例子包括“lol”、“abba”、“radar”和“pickle elkcip”。指出它是否在以下docstring中描述的所有情况下都有效:“如果字符串s是回文,则返回True,否则返回False。”


我不明白为什么这个函数不起作用。在我看来,这项功能似乎有效。显然,布尔值被误用了,但我不明白上面的布尔值是如何被正确使用的。有人能给我解释一下吗?

你总是检查每个字符。您需要在明确知道结果后立即返回。

循环体的编码方式,
pal
的值可能会在
True
False
之间反复变化,这取决于给定的一对字符在特定迭代期间是否匹配

最好检查不平等性,将布尔变量
pal
设置为
False
,然后立即退出循环

大概是这样的:

def palindrome2(s):
    n = len(s)
    pal = True

    for i in range(n/2)
        if s[i] != s[n-i-1]: # the moment it's false
           pal = False       # set pal and
           break             # drop out of the loop

    return pal
或者,在不使用布尔变量的情况下:

    ...
    for i in range(n/2)
        if s[i] != s[n-i-1]: # the moment it's false
           return False      # exit the function by returning False

    return True  # otherwise return True

为了好玩,您还可以尝试更简单的方法:

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

(关于它是如何工作的留给读者的练习)

@ulmangt的解决方案非常聪明,但我会选择一个不那么神秘的:

def palindrome(s):
    return all(( s[i] == s[-(i+1)] for i in range(len(s)/2) ))

至少它做了一半的比较;-)

@IgnacioVazquez Abrams你指的是第二种替代方案吗?是的,我同意,这是一个干净的选择。第一个代码最接近原始代码,这就是它存在的原因range@Akavall好的呼叫:)(已修复)您是否使用各种类型的测试输入运行程序?甚至还有一些框架可以让这变得更容易+1用于优化比较次数。(然而,在我的测试中,这花费了@ulmangt实现时间的3.5倍。)你也可以使用
not(任何((s[i]!=s[-(i+1)],因为i在(len(s)/2)范围内)
,当候选对象不是回文时,你可以避免一些比较。有趣的是。。。这不是一个列表,也不是一套理解。。。它是什么?它如何避免一些比较呢?啊,这是使用生成器对象。。。酷。而
any()
一旦找到正确的值,就会短路。
def palindrome(s):
    return all(( s[i] == s[-(i+1)] for i in range(len(s)/2) ))