代码之家  ›  专栏  ›  技术社区  ›  U13-Forward

我应该使用str.something()还是“”。something()?

  •  2
  • U13-Forward  · 技术社区  · 6 年前

    我的问题基本上是标题,在本例中我使用 .lower() 作为功能,

    所以:

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

    哪一个更好,更好?(我认为这应该是第一个,因为它比较容易,但我还是不知道。)

    3 回复  |  直到 6 年前
        1
  •  7
  •   abarnert    6 年前

    如果您只是直接打电话,请使用 界限法 s.lower() 绝对是首选。它表达了你的意思(目标:做这个!),它更短,对读者来说更明显,而且对于像 str (但速度和你自己创建的类型差不多)。


    不同的是,当您需要存储方法或将其作为回调等传递时,而不是立即调用它。在这种情况下,你想要做的几乎总是显而易见的:

    • 如果你想在一个你还没见过的字符串上调用这个方法,或者在一大堆不同的字符串上调用这个方法,你需要存储/传递/任何未绑定的方法, str.lower .
    • 如果你想对你周围的字符串调用这个方法,特别是如果你想在同一个字符串上反复调用这个方法,你需要存储/传递/不管绑定的方法是什么, s.lower .

    对于这种情况 下楼梯 很容易想到未绑定方法的用途,比如:

    lower_strings = map(str.lower, strings)
    

    或者,无耻地从 Dair's answer 因为它比我的好:

    sorted_strings = sorted(strings, key=str.lower)
    

    但是很难想象为什么你要调用绑定方法 S.下 一遍又一遍。

    但是考虑这些其他案例 不同的 方法:

    • 你在建立一个图形用户界面,你想要一个 onclick 方法来在每次单击按钮时对窗口对象进行调用。显然,您总是希望在这个特定的窗口对象(拥有按钮的对象)上调用该方法,因此您将使用绑定方法 self.onclick 作为按钮回调,而不是未绑定的方法 Window.onclick .
    • 你在寻找独特的价值观,你保留一套吗? values_seen ,在您迄今为止看到的所有价值观中。 values_seen.add 可能是存储或传递给其他函数的有用东西,但是 set.add 对你没有好处。

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

    lambda x: x.lower()
    

    就像是 下楼梯 ,你可以把它传给 map 或者把它留到以后,更复杂,更慢。那么,你为什么要这么做?

    假设您需要一个调用 lower 任何“duck类型”的字符串,而不仅仅是实际的字符串。例如, b'AbC'.lower() 是一件完全正确的事情。所以,如果您有一个字符串或字节的列表,但是您不确定是哪个,并且您想将它们全部小写,那么您不能 map(str.lower, xs) map(bytes.lower, xs) 但是你可以 map(lambda x: x.lower(), xs) .

    尽管在这种特殊情况下,您通常需要使用理解:

    (x.lower() for x in xs)
    
        2
  •  2
  •   Dair    6 年前

    .lower str.lower 自从 下楼梯 仅适用于字符串。但是,也有这样的情况 bytes.lower 在何处 下楼梯 ) 这是唯一可行的方法。因此,除非您有一些性能案例(或类型检查案例),否则我建议您使用更通用的方法。

    下楼梯 仍然可以方便地传递到以下函数 map 以及进入 key parameter for sort 以及其他相关功能。

        3
  •  -1
  •   U13-Forward    6 年前

    如果您想一次性使用,第二个更容易,但一般来说,首选第一个选项。

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