Python教程问题:结束函数

use*_*756 4 python

我有一个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  
Run Code Online (Sandbox Code Playgroud)

但错误消息窗口显示:所有公共测试都已通过,但某些私有测试失败.您需要概括您的解决方案.

问题在于我的解决方案?还是我错过了一些事情?

Thi*_*ter 16

那么使用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)
Run Code Online (Sandbox Code Playgroud)


pok*_*oke 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 ):]
Run Code Online (Sandbox Code Playgroud)

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

  • s1[-len(s2)]或者通常s1[x]只获得一个角色.所以,如果有的话,你只是比较单个字符,而不是实际的字符序列.您将序列拼接出一个字符串s[x:y](参见手册).
  • s2[-len(s2)]即使是如上所述的冒号,也没有多大意义.您正在s2使用自己的长度访问.但是,由于s2已经是较小的字符串,您可以将其作为一个整体进行比较.
  • 当你的一个外部ifs匹配某种情况时,任何其他外部情况都无法跟随.例如,如果ab,没有方式a会更短或相同长度的作为b以后.因此,你应该使你的if结构支持.而不是if ... if ... if ... else做一个链:if ... elif ... elif ... else.然后人们自动知道只有其中一个案例可以申请.
  • 当你这样做时,你也可以不用最后一个if表达式.因为既不是x < y也不y < x等于真,那么x等于y.
  • 您还需要更改从函数中返回的方式.截至目前,您在每个外部if情况下都有一个条件退出.现在,如果第一个if情况适用(即s1长于s2)并且内部if不适用(s1不结束s2),那么您已经知道该函数应该返回False.因为代码后面的任何其他条件都没有办法说明,所以你应该立即返回False(特别是当有其他代码可能会在以后执行时).如果你有,if x: return True else: return False那么你可以return x.
  • s1[-len(s1)]==s2[-len(s2)]:作为其他前面已经说了,你将有一个问题,当s1s2是空字符串.len( "" ) = 0如果两个字符串都为空,则两个长度都相同.然后你的代码尝试在空字符串上使用索引范围,这将始终失败(因为没有单个字符).相反,当你已经知道两个字符串具有相同的大小时,只需将它们作为一个整体进行比较.这也有助于防止空字符串.

无论如何,如果你不需要自己实现它,你应该真的使用它str.endswith.