Python教程问题:以...结尾的函数

4 投票
6 回答
8768 浏览
提问于 2025-04-16 10:30

我有一个关于Python教程的问题,卡在这里过不去了。问题是这样的:

以...结尾
给定两个字符串,如果其中一个字符串出现在另一个字符串的最后面(不管大小写),就返回True。也就是说,计算的时候不考虑字母的大小写。

我的解决方案:

def end_other(a,b):     
    s1=a.lower()    
    s2=b.lower()   
    if len(s1)>len(s2):  
        if s1[-len(s2)]==s2[-len(s2)]:  
            return True  
    if len(s1)<len(s2):  
        if s1[-len(s1)]==s2[-len(s1)]:  
            return True  
    if len(s1)==len(s2):  
        if s1[-len(s1)]==s2[-len(s2)]:  
            return True  
    else:  
         return False  

但是错误信息窗口显示:所有公共测试都通过了,但一些私有测试失败了。你需要让你的解决方案更通用。

我的解决方案有什么问题吗?或者我有没有遗漏什么?

6 个回答

2

用空字符串进行比较会出问题。建议使用 .endswith() 方法来代替。

7

我觉得你其实是想做这个:

def end_other ( a, b ):
    a = a.lower()
    b = b.lower()
    if a == b:
        return True
    elif len( a ) > len( b ):
        return b == a[-len( b ):]
    else:
        return a == b[-len( a ):]

你的解决方案里有几个错误:

  • s1[-len(s2)] 或者一般的 s1[x] 只会获取一个单独的字符。所以你实际上只是在比较一个字符,而不是一串字符。要从字符串中提取一段字符,你应该用 s[x:y](可以查查手册)。
  • s2[-len(s2)],即使加上冒号,像上面说的那样,也没什么意义。你是在用 s2 的长度来访问它自己。但因为 s2 本身就是较短的字符串,你可以直接把它整体进行比较。
  • 当你外层的某个条件成立时,其他外层的条件就不可能再成立了。比如说如果 ab ,那么之后就不可能 a 会比 b 短或者长度相同。因此你应该让你的条件结构支持这一点。与其写 if ... if ... if ... else,不如用链式结构:if ... elif ... elif ... else。这样一来,大家就知道这些情况中只会有一个成立。
  • 这样做的话,你也可以省略最后一个 if 表达式。因为当 x < yy < x 都不成立时,x 就等于 y
  • 你还需要改变从函数内部返回的方式。目前你在每个外层的条件里都有一个条件退出。如果第一个条件成立(也就是 s1s2 长),而内部条件不成立(s1 不以 s2 结尾),那么你已经知道这个函数应该返回 False。因为后面的条件不可能有其他结果,所以你应该立即返回 False(特别是当后面还有其他代码可能会执行时)。而且当你写 if x: return True else: return False 时,可以直接用 return x
  • s1[-len(s1)]==s2[-len(s2)]:正如其他人所说,当 s1s2 是空字符串时,你会遇到问题。len( "" ) = 0,如果两个字符串都是空的,那么它们的长度是相同的。然后你的代码尝试在空字符串上使用索引范围,这总是会失败(因为没有任何字符)。所以,当你已经知道两个字符串大小相同时,直接整体比较就可以了。这也能防止空字符串的问题。

总之,如果你不需要自己实现这个功能,真的应该用 str.endswith 来替代。

17

那用Python自带的 str.endswith() 方法怎么样呢?

def end_other(a, b):
    a_lower = a.lower()
    b_lower = b.lower()
    return a_lower.endswith(b_lower) or b_lower.endswith(a_lower)

撰写回答