使用 python endswith 和 substring 的区别

Differences between using python endswith and substring

我遇到过一种情况,提出了两种解决方案。

假设我有一个字符串 "foo bar" 作为输入,我需要检查它是否以 "bar" 结尾。

一个人的解法是这样的:

is_bar = lambda x: x[-3:] == "bar"

对方的解决方法是这样的:

is_bar = lambda x: x.endswith("bar")

任何人都可以深入了解两者之间的差异以及首选哪个吗?假设只有一个后缀 "bar" 是首选,因为 endswith 可以有后缀的元组,如果有更多的话将是首选。

endswith 效率更高,因为它不会花费额外的 space(除了两个字符串比较在内部使用的)并且可以在第一个不相等的字符处停止。而且您不需要提供长度。对于不太习惯切片符号的人来说可能更清楚。而且比 x[-31:] == "toolongtoimmediatelyseethelength".

更清晰,更不容易出错

切片需要额外 space,甚至在比较第一个字符之前就已完全创建,您需要提供长度。但是当你玩代码高尔夫时会更好。

如果潜在的结束字符串没有被硬编码,切片比较甚至有一个微妙的错误。 x[-1:] 为您提供长度为 1 的后缀,而 x[-0:] 而不是 为您提供长度为 0 的后缀,而是整个字符串。因此,当 s 为空但 x 不为空时,x[-len(s):] == s 失败,它变为 x[0:] == '' 并导致 False。正确的结果很简单 Truex.endswith(s) 得到了它。我也刚刚在 where I don't need a special case for no-overlap cases but 中使用了它。