U10*_*ard 1 python string python-3.x
我的问题基本上是标题,在这种情况下我.lower()用作函数,
所以:
>>> s = 'A'
>>> s.lower()
'a'
>>> str.lower(s)
'a'
Run Code Online (Sandbox Code Playgroud)
哪一个更好,更优先?(我认为它应该是第一个,因为它更容易,但我仍然不知道.)
如果你只是直接调用它,那么使用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一遍又一遍地调用绑定方法.
但是用不同的方法考虑这些其他情况:
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)