3.2 函数

假设你正在分析一些文本,这些文本包含同一个词的不同形式,你的一部分程序需要将给定的单数名词变成复数形式。假设需要在两个地方做这样的事,一个是处理一些文本,另一个是处理用户的输入。

比起重复相同的代码好几次,把这些事情放在一个函数中会更有效和可靠。一个函数是命名的代码块,执行一些明确的任务,就像我们在1中所看到的那样。一个函数通常被定义来使用一些称为参数的变量接受一些输入,并且它可能会产生一些结果,也称为返回值。我们使用关键字def加函数名以及所有输入参数来定义一个函数,接下来是函数的主体。这里是我们在1看到的函数(对于 Python 2,请包含import语句,这样可以使除法像我们期望的那样运算):

  1. >>> from __future__ import division
  2. >>> def lexical_diversity(text):
  3. ... return len(text) / len(set(text))

我们使用关键字return表示函数作为输出而产生的值。在这个例子中,函数所有的工作都在return语句中完成。下面是一个等价的定义,使用多行代码做同样的事。我们将把参数名称从text变为my_text_data,注意这只是一个任意的选择:

  1. >>> def lexical_diversity(my_text_data):
  2. ... word_count = len(my_text_data)
  3. ... vocab_size = len(set(my_text_data))
  4. ... diversity_score = vocab_size / word_count
  5. ... return diversity_score

请注意,我们已经在函数体内部创造了一些新的变量。这些是局部变量,不能在函数体外访问。现在我们已经定义一个名为lexical_diversity的函数。但只定义它不会产生任何输出!函数在被“调用”之前不会做任何事情:

  1. >>> from nltk.corpus import genesis
  2. >>> kjv = genesis.words('english-kjv.txt')
  3. >>> lexical_diversity(kjv)
  4. 0.06230453042623537

让我们回到前面的场景,实际定义一个简单的函数来处理英文的复数词。3.1中的函数plural()接受单数名词,产生一个复数形式,虽然它并不总是正确的。(我们将在4.4中以更长的篇幅讨论这个函数。)

  1. def plural(word):
  2. if word.endswith('y'):
  3. return word[:-1] + 'ies'
  4. elif word[-1] in 'sx' or word[-2:] in ['sh', 'ch']:
  5. return word + 'es'
  6. elif word.endswith('an'):
  7. return word[:-2] + 'en'
  8. else:
  9. return word + 's'

endswith()函数总是与一个字符串对象一起使用(如3.1中的word)。要调用此函数,我们使用对象的名字,一个点,然后跟函数的名称。这些函数通常被称为方法。