Различия между использованием python заканчивается с подстрокой - PullRequest
0 голосов
/ 22 января 2020

Я сталкивался с ситуацией, когда предлагаются два решения.

Допустим, у меня есть строка "foo bar" в качестве ввода, и мне нужно проверить, что она заканчивается на "bar".

Решение одного человека таково:

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

Решение другого человека таково:

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

Может ли кто-нибудь дать представление о различиях между ними и что является предпочтительным ? Предположим, что когда-либо предпочтителен только один суффикс "bar", поскольку endswith может иметь наборы суффиксов и будет предпочтительным, если их будет больше.

1 Ответ

2 голосов
/ 22 января 2020

endswith более эффективен, так как не требует дополнительного места (кроме того, что оба сравнения строк используют внутри) и может останавливаться на первом неравном символе. И вам не нужно указывать длину. И это, вероятно, понятнее людям, которые менее привыкли к разрезанию обозначений. А также более понятный и менее подверженный ошибкам, чем, например, x[-31:] == "toolongtoimmediatelyseethelength".

. Срез занимает дополнительное пространство, полностью создается до того, как будет сравнен даже первый символ, и вам необходимо указать длину. Но лучше, когда вы играете в гольф с кодом.

Если потенциальная конечная строка не жестко закодирована, сравнение срезов даже имеет небольшую ошибку. В то время как x[-1:] получает суффикс длины 1, x[-0:] делает не , а суффикс длины 0, но всю строку. Таким образом, x[-len(s):] == s завершается ошибкой, когда s пусто, но x нет, где оно становится x[0:] == '' и приводит к False. Правильный результат тривиален True, и x.endswith(s) получает его. Я также только что использовал это в другом ответе , где мне не нужен особый случай для случаев без наложения, но ответ, сравнивающий фрагменты .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...