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
但是错误信息窗口显示:所有公共测试都通过了,但一些私有测试失败了。你需要让你的解决方案更通用。
我的解决方案有什么问题吗?或者我有没有遗漏什么?
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
本身就是较短的字符串,你可以直接把它整体进行比较。- 当你外层的某个条件成立时,其他外层的条件就不可能再成立了。比如说如果
a
比b
长,那么之后就不可能a
会比b
短或者长度相同。因此你应该让你的条件结构支持这一点。与其写if ... if ... if ... else
,不如用链式结构:if ... elif ... elif ... else
。这样一来,大家就知道这些情况中只会有一个成立。 - 这样做的话,你也可以省略最后一个
if
表达式。因为当x < y
和y < x
都不成立时,x
就等于y
。 - 你还需要改变从函数内部返回的方式。目前你在每个外层的条件里都有一个条件退出。如果第一个条件成立(也就是
s1
比s2
长),而内部条件不成立(s1
不以s2
结尾),那么你已经知道这个函数应该返回 False。因为后面的条件不可能有其他结果,所以你应该立即返回 False(特别是当后面还有其他代码可能会执行时)。而且当你写if x: return True else: return False
时,可以直接用return x
。 s1[-len(s1)]==s2[-len(s2)]
:正如其他人所说,当s1
和s2
是空字符串时,你会遇到问题。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)