Мой вопрос в основном заголовок, в этом случае я использую .lower() в качестве функции,

Так:

>>> s = 'A'
>>> s.lower()
'a'
>>> str.lower(s)
'a'

Какой из них лучше, предпочтительнее? (Я думаю, что это должно быть первым, потому что это проще, но все же я не знаю.)

1
U10-Forward 21 Авг 2018 в 05:14

3 ответа

Лучший ответ

Если вы просто вызываете его напрямую, определенно предпочтительнее использовать связанный метод s.lower(). Он говорит, что вы имеете в виду (объект: сделайте это!), Он короче, он более понятен для читателя и еще быстрее с встроенными типами, такими как str (но примерно с той же скоростью, что и типы, которые вы создаете сами).


Разница заключается в том, что вам нужно сохранить метод или передать его как обратный вызов и т. Д. Вместо немедленного вызова. В этом случае почти всегда очевидно, что вы хотите сделать:

  • Если вы хотите вызвать метод для строки, которую вы еще не видели, или для целого ряда различных строк, вы хотите сохранить / передать / любой другой несвязанный метод, str.lower.
  • Если вы хотите вызывать метод для строки, которую вы сидите, особенно если вы хотите вызывать его снова и снова в одной и той же строке, вы хотите сохранить / передать / любой связанный метод, s.lower.

Для случая str.lower довольно легко придумать варианты использования несвязанного метода, например:

lower_strings = map(str.lower, strings)

Или бесстыдно воровать у ответа Дэйра, потому что это лучший пример, чем мой:

sorted_strings = sorted(strings, key=str.lower)

Но довольно сложно представить, почему вы захотите вызывать связанный метод s.lower снова и снова.

Но рассмотрим эти другие случаи с разными методами:

  • Вы создаете графический интерфейс, и вы хотите, чтобы определенный onclick метод вызывался для вашего оконного объекта при каждом нажатии кнопки. Очевидно, что вы всегда хотите, чтобы метод вызывался для этого конкретного оконного объекта, который владеет кнопкой, поэтому вы будете использовать связанный метод self.onclick в качестве обратного вызова кнопки, а не несвязанный метод Window.onclick ,
  • Вы ищете уникальные значения, сохраняете ли вы набор values_seen всех значений, которые вы видели до сих пор. values_seen.add может быть полезным для хранения или передачи какой-либо другой функции, но set.add не принесет вам никакой пользы.

Есть также третий случай, который вы не упомянули:

lambda x: x.lower()

Это так же, как str.lower, в том смысле, что вы можете передать его map или сохранить его на потом, более сложный и медленный. Итак, зачем ты это сделал?

Представьте, что вам нужна функция, которая вызывает lower для всего, что "типа утки", в виде строки, а не только для реальной строки. Например, b'AbC'.lower() - совершенно правильная вещь. Итак, если у вас есть список строк или байтов, но вы не уверены, какие именно, и вы хотите сделать их строчными, вы не можете map(str.lower, xs) или map(bytes.lower, xs), но вы можете {{X4 } } .

Хотя для этого конкретного случая вы можете - и обычно должны - просто использовать понимание:

(x.lower() for x in xs)
7
abarnert 21 Авг 2018 в 02:31

Второй вариант проще, если вы хотите использовать его один раз, но обычно предпочтительнее первый вариант.

Если вы планируете использовать эту строку в следующих строках кода (что, вероятно, верно для 99% кода), вам почти наверняка понадобится переменная, на которую вы можете ссылаться.

-1
U10-Forward 25 Авг 2018 в 00:54

.lower является более общим, чем str.lower, поскольку str.lower работает только для строк. Однако есть такие случаи, как bytes.lower где (между str.lower и .lower) .lower - единственный способ, который работает. Следовательно, если у вас нет некоторого случая с производительностью (или случая проверки типа), я бы посоветовал в сторону большей общности.

str.lower все еще может быть удобным, поскольку его можно передавать в функции, такие как map, а также в ключевой параметр для sort вместе с другими связанными функциями.

2
Dair 21 Авг 2018 в 02:30
51940695