返回字符串中最长单词的Pythonic方法

时间:2014-09-02 22:59:36

标签: python string function string-length

我理解发现字符串中最长的单词已被多次询问和回答但我想知道以下方法之间的区别,以及为什么会使用方法A而不是方法B,反之亦然。

接近A

def LongestWord(sen):
  lw = ''
  w = ''
  for c in sen:
    if c.isalpha():
      w += c
    else:
      if len(w) > len(lw):
        lw = w
      w = ''
  if len(w) > len(lw):
    lw = w
  return lw

VS方法B

def LongestWord(sen): 
  x = max(sen.split(), key=len)
  return x

同样,我的目标是询问哪种方法更稳定,缺乏更好的词语选择,以及为什么。如果您有自己的替代方案,请将其与您的说明一起发布。谢谢!

4 个答案:

答案 0 :(得分:1)

有不同的原因。 最重要的是,作为软件开发人员,您必须使用最简单,最易于理解的方式编写函数。 方法B简洁,简洁,易于理解。方法A太复杂,无法理解:如果不知道函数的名称,就很难知道它的作用。

这指向了一个不同的方面:难以阅读的代码太难以调试。方法B是否正确?一目了然,是的。方法是正确的吗?这很难理解。我们可以编写一个测试来查看两个函数是否都有效(我们应该这样做),但如果一个函数不能正常工作,调试方法B比方法A更容易。

最后但并非最不重要的是,方法B的速度提高了10倍

if __name__ == '__main__':
    import timeit

    print(timeit.timeit("LongestWordA('hello this is just an example')", number=1000, setup="from __main__ import LongestWordA"))
    print(timeit.timeit("LongestWordB('hello this is just an example')", number=1000, setup="from __main__ import LongestWordB"))

    # LongestWordA 0.013688346021808684
    # LongestWordB 0.004950157948769629

答案 1 :(得分:0)

当我查看第二种方法时,我可以立即看到发生了什么 - 在连续的空格运行中拆分字符串,然后返回最长的子字符串。

当我看第一种方法时,需要做更多的工作来弄清楚发生了什么。

关键是python为执行这些简单的任务提供了非常强大的实用程序 - 它使代码更容易编写,更易于阅读,更不容易出错等等。学习使用常见的习语和函数来你的优势是(恕我直言)成为“pythonic”的本质

答案 2 :(得分:0)

首先,第二种方法非常易读,而第一种方法则不是。该方法显然(具有max方法的知识)执行函数的名称。编写可读代码是我最喜欢的Python部分。

其次,第一种方法负责定义一个单词是什么。

部分
for c in sen:
  if c.isalpha():
    w += c

会使2spooky4me短于spookytoo,因为LongestWord不会将单个整数字符计为单词(ex. '2'.isalpha() == False)的一部分。对于使用此代码的人来说,这可能是意外行为。

最后,第二个例子更优雅地使用Pythons内置方法(例如max的特征而不仅仅是len和binary运算符),我认为这是设计语言的一个重要目标。

答案 3 :(得分:0)

方法B 更好的远景。使用所有嵌套逻辑和简洁变量名称,方法A令人困惑。

[PEP 20]:

  • 美丽胜过丑陋。
  • 可读性很重要。
  • 如果实施难以解释,那就不错了。

    $ python -c "import this"