我应该使用str.something(...)还是'...'.something()?

U10*_*ard 1 python string python-3.x

我的问题基本上是标题,在这种情况下我.lower()用作函数,

所以:

>>> s = 'A'
>>> s.lower()
'a'
>>> str.lower(s)
'a'
Run Code Online (Sandbox Code Playgroud)

哪一个更好,更优先?(我认为它应该是第一个,因为它更容易,但我仍然不知道.)

aba*_*ert 7

如果你只是直接调用它,那么使用bound方法 s.lower()肯定是首选.它说出你的意思(对象:做到这一点!),它更短,对读者来说更明显,内置类型更快str(但与你自己创建的类型大致相同).


不同之处在于您需要存储方法,或将其作为回调等传递,而不是立即调用它.在这种情况下,几乎总是很明显你想做什么:

  • 如果您想要在尚未看到的字符串上调用该方法,或者在一大堆不同的字符串上调用该方法,则需要存储/传递/无论未绑定的方法,str.lower.
  • 如果你想在你周围的字符串上调用方法,特别是如果你想在同一个字符串上反复调用它,你想要存储/传递/无论绑定的方法,s.lower.

对于这种情况str.lower,很容易想到未绑定方法的用途,例如:

lower_strings = map(str.lower, strings)
Run Code Online (Sandbox Code Playgroud)

或者,从Dair的回答中无耻地窃取,因为这是一个比我更好的例子:

sorted_strings = sorted(strings, key=str.lower)
Run Code Online (Sandbox Code Playgroud)

但是很难想象你为什么要s.lower一遍又一遍地调用绑定方法.

但是用不同的方法考虑这些其他情况:

  • 您正在构建GUI,并且onclick每次单击按钮时都希望在窗口对象上调用某个方法.显然,你总是希望在这个特定的窗口对象(拥有该按钮的对象)上调用该方法,因此你将使用bound方法self.onclick作为按钮回调,而不是未绑定的方法Window.onclick.
  • 你正在寻找独特的价值观,你是否保留了values_seen迄今为止所见过的所有价值观.values_seen.add存储或传递给其他函数可能是一个有用的东西,但set.add对你没有任何好处.

还有第三个案例你没有提到:

lambda x: x.lower()
Run Code Online (Sandbox Code Playgroud)

这就像是str.lower,你可以将它传递给map或保存以供以后使用,更复杂,更慢.那么,你为什么要这样做呢?

想象一下,你需要一个函数来调用lower任何"鸭子类型"作为字符串,而不仅仅是实际的字符串.例如,这b'AbC'.lower()是一个非常有效的事情.所以,如果你有一个字符串或字节的列表,但你不确定哪个,并且你想要将它们全部小写,你就不能,map(str.lower, xs)或者map(bytes.lower, xs)你可以map(lambda x: x.lower(), xs).

虽然对于那种特殊情况,你可以 - 而且通常只应该使用一种理解:

(x.lower() for x in xs)
Run Code Online (Sandbox Code Playgroud)