使用 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
。正确的结果很简单 True
, x.endswith(s)
得到了它。我也刚刚在 where I don't need a special case for no-overlap cases but 中使用了它。
我遇到过一种情况,提出了两种解决方案。
假设我有一个字符串 "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
。正确的结果很简单 True
, x.endswith(s)
得到了它。我也刚刚在