我遇到过提出两种解决方案的情况。
假设我有一个字符串“foo bar”作为输入,我需要检查它是否以“bar”结尾。
一个人的解决方案是这样的:
is_bar = lambda x: x[-3:] == "bar"
另一个人的解决方案是这样的:
is_bar = lambda x: x.endswith("bar")
任何人都可以深入了解两者之间的差异以及首选哪个?假设只有一个后缀“bar”是首选的,因为endswith
可以有后缀的元组,如果有更多,那将是首选。
endswith
效率更高,因为它不需要额外的空间(除了两个字符串比较在内部使用的空间)并且可以在第一个不相等的字符处停止。而且您不需要提供长度。对于不太习惯切片符号的人来说,它可能更清楚。并且比 example 更清晰,更不容易出错x[-31:] == "toolongtoimmediatelyseethelength"
。
切片占用额外空间,甚至在比较第一个字符之前就已完全创建,您需要提供长度。但是,当您玩代码高尔夫时会更好。
如果潜在的结束字符串没有被硬编码,切片比较甚至有一个微妙的错误。虽然x[-1:]
为您提供长度为 1 的后缀,x[-0:]
但不会为您提供长度为 0 的后缀,而是为您提供整个字符串。所以x[-len(s):] == s
失败时s
为空但x
不是,它变成x[0:] == ''
并导致False
. 正确的结果是 trivially True
,并x.endswith(s)
得到它。我也只是在另一个答案中使用了它,在该答案中我不需要针对不重叠情况的特殊情况,但比较切片的答案确实如此。