为何Python回文判断代码添加.lower后结果异常?
回文判断代码问题分析
核心错误:.lower少了括号
你异常代码里的input_string.lower写法有误,必须写成input_string.lower()。因为lower是字符串的方法,不加括号的话,你拿到的是这个方法本身的对象,而非转成小写后的字符串。拿方法对象和reverse_string(字符串类型)做比较,结果必然不相等,所以像“kayak”这类全小写回文会返回False。
原代码的其他问题
你所谓“可正常运行”的代码其实存在不少bug:
- 循环变量用
range是错误的,range是Python内置关键字/函数,不能用来当变量名,换成char这类名称才合理。 - 循环里的
if input_string.isalpha()是判断整个输入字符串是否全为字母,而非逐个字符过滤非字母内容。比如输入“Never Odd or Even”包含空格,这个条件本不成立,但你的代码缩进有问题(if语句后的代码未缩进),导致不管条件是否满足都会执行赋值操作,最后实际是拿原字符串和反转后的原字符串比较——而“Never Odd or Even”原字符串和反转后的字符串根本不一致,你说返回True应该是代码实际缩进或测试时的巧合。 - 代码完全没处理非字母字符(比如空格、标点),也没统一大小写,真正的回文判断应该先过滤掉非字母数字的字符,再统一转成小写(或大写)后再做比较。
修正后的示例代码
def is_palindrome(input_string): # 过滤非字母字符并统一转小写 processed_string = ''.join([char.lower() for char in input_string if char.isalpha()]) # 比较处理后的字符串和其反转 return processed_string == processed_string[::-1]
这个版本先过滤所有非字母字符,统一转成小写,再直接比较字符串和它的反转(用切片[::-1]比reversed更简洁),能正确处理各种回文场景,比如“Never Odd or Even”“Kayak”“A man, a plan, a canal: Panama”等。
内容的提问来源于stack exchange,提问作者Nick DePuy
相关产品推荐
相关产品推荐

