我应该使用str.something(…)或'...'。something()吗?

时间:2018-08-21 02:14:11

标签: python string python-3.x

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

所以:

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

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

3 个答案:

答案 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

但是请考虑使用不同方法的其他情况:

  • 您正在构建GUI,并且您希望每次单击按钮时在窗口对象上调用某个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)

.lowerstr.lower更通用,因为str.lower仅适用于字符串。但是,在诸如bytes.lower的情况下,str.lower是唯一有效的方法(在.lower.lower之间)。因此,除非您有一些性能案例(或类型检查案例),否则我建议您更笼统。

str.lower仍然很方便,因为它可以传递到map之类的函数中,也可以传递给key parameter for sort以及其他相关函数。

答案 2 :(得分:-1)

如果要一次性使用第二个,则比较容易,但是通常首选第一个。

如果您打算在下面的代码行中完全使用字符串(对于99%的代码来说可能是正确的),则几乎可以肯定需要一个可以引用的变量。