Мой вопрос в основном заголовок, в этом случае я использую .lower()
в качестве функции,
Так:
>>> s = 'A'
>>> s.lower()
'a'
>>> str.lower(s)
'a'
Какой из них лучше, предпочтительнее? (Я думаю, что это должно быть первым, потому что это проще, но все же я не знаю.)
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)
Второй вариант проще, если вы хотите использовать его один раз, но обычно предпочтительнее первый вариант.
Если вы планируете использовать эту строку в следующих строках кода (что, вероятно, верно для 99% кода), вам почти наверняка понадобится переменная, на которую вы можете ссылаться.
.lower
является более общим, чем str.lower
, поскольку str.lower
работает только для строк. Однако есть такие случаи, как bytes.lower
где (между str.lower
и .lower
) .lower
- единственный способ, который работает. Следовательно, если у вас нет некоторого случая с производительностью (или случая проверки типа), я бы посоветовал в сторону большей общности.
str.lower
все еще может быть удобным, поскольку его можно передавать в функции, такие как map
, а также в ключевой параметр для sort
вместе с другими связанными функциями.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.