我的问题基本上是标题,在这种情况下,我使用.lower()
作为函数,
所以:
>>> s = 'A'
>>> s.lower()
'a'
>>> str.lower(s)
'a'
哪个更好,更喜欢? (我认为它应该是第一个,因为它更容易,但我仍然不知道。)
答案 0 :(得分:7)
如果您只是直接调用它,则绝对首选使用 bound方法 s.lower()
。它说出了您的意思(对象:执行此操作!),它更短,对读者来说更明显,对于str
之类的内置类型,它甚至更快(但与您自己创建的类型几乎相同)。 / p>
区别在于您需要存储方法或将其作为回调传递给其他人,而不是立即调用它。在这种情况下,几乎总是很想做什么:
str.lower
。s.lower
。对于str.lower
,很容易想到unbound方法的用法,例如:
lower_strings = map(str.lower, strings)
或者,无耻地从Dair's answer窃取,因为这是比我更好的例子:
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)
,但是可以{{1 }}。
尽管对于这种特殊情况,您可以并且通常应该使用理解力:
map(lambda x: x.lower(), xs)
答案 1 :(得分:2)
.lower
比str.lower
更通用,因为str.lower
仅适用于字符串。但是,在诸如bytes.lower
的情况下,str.lower
是唯一有效的方法(在.lower
和.lower
之间)。因此,除非您有一些性能案例(或类型检查案例),否则我建议您更笼统。
str.lower
仍然很方便,因为它可以传递到map
之类的函数中,也可以传递给key parameter for sort
以及其他相关函数。
答案 2 :(得分:-1)
如果要一次性使用第二个,则比较容易,但是通常首选第一个。
如果您打算在下面的代码行中完全使用字符串(对于99%的代码来说可能是正确的),则几乎可以肯定需要一个可以引用的变量。