Python程序设计:人工智能案例实践
上QQ阅读APP看书,第一时间看更新

4.2 函数定义

在本书前面章节的示例中已经调用过许多内置函数(intfloatprintinputtypesumlenminmax)和statistics模块中的一些函数(meanmedianmode),每个函数都执行了一项明确定义的任务。除了这些已经定义好的函数外,我们还会经常定义和调用自定义函数。下面的代码段定义了一个square函数,用于计算其参数的平方,然后调用了两次square函数,第一次计算int7的平方(得到int49),第二次计算float2.5的平方(得到float6.25):

在代码段[1]中定义函数square的语句只需写一次,但可以根据需要在整个程序中多次调用这个函数。如果使用非数值类型的参数(如'hello')调用square会导致TypeError,因为取幂运算符(**)只能作用于数值型的操作数。

定义一个自定义函数

函数定义(如代码段[1]中的square)以关键字def开头,后跟函数名(square)、一对括号和一个冒号(:)。按照惯例,与变量标识符类似,函数名称应以小写字母开头,在多词名称中,应使用下划线分隔每个单词。

括号中包含参数列表,各参数以逗号进行分隔,表示函数执行任务时所需的数据。函数square只有一个参数number,是需要计算平方的值。如果括号为空,则该函数执行任务时不需要参数。

冒号(:)后面缩进的行是函数的语句块,它包含一个可选的文档字符串,接着是执行函数任务的语句。后面会介绍函数的语句块和控制语句套件之间的区别。

自定义函数的文档字符串

Style Guide for Python Code指出,在函数的语句块中,第一行应该是一个文档字符串,用来简要说明函数的用途:

要提供更详细的信息,可以使用多行文档字符串。Style Guide for Python Code建议从简短说明开始,后跟空行和其他详细信息。

将结果返回给函数的调用者

当一个函数执行完成时,会将控制权返回给它的调用者,即调用该函数的代码行。在square的函数块中,返回语句

首先计算number的平方,然后终止该函数并将结果返回给调用者。在上面的例子中,第一个调用者在代码段[2]中,因此IPython在Out[2]中显示结果。第二个调用者在代码段[3]中,因此IPython在Out[3]中显示结果。

函数调用也可以嵌入表达式中。下面的代码会先调用函数square,然后用print显示结果:

还有另外两种方法可以将控制权从函数返回给调用者:

  • 执行不带表达式的return语句会终止该函数,并隐式地将值None返回给调用者。Python文档规定None表示空值,在条件语句中被评估为False
  • 当函数中没有return语句时,它会在执行函数语句块中的最后一条语句后隐式地返回None

局部变量

虽然上面的例子没有在函数square的语句块中定义变量,但事实上Python是允许在函数的语句块中定义变量的。在函数的语句块中定义的参数和变量都是局部变量,仅在函数执行时存在,且只能在函数内部使用。尝试访问函数语句块之外的局部变量会导致NameError,表示该变量未定义。

通过IPython的帮助机制访问函数的文档字符串

IPython可以帮助我们了解想要在代码中使用的模块和函数,甚至可以是IPython本身。例如,想要知道如何使用某个函数,可以查看该函数的文档字符串,查看的方法是键入函数的名称,后跟问号?),如下所示:

对于函数square,显示的信息包括:

  • 函数的名称和参数列表,称为函数的签名
  • 函数的文档字符串。
  • 包含函数定义的文件的名称。对于交互式会话中的函数,此行显示定义函数的代码段的信息,例如“<ipython-input-1-7268c8ff93a9>”中的1表示代码段[1]
  • 访问IPython帮助机制的项的类型,在本例中是“函数”。

如果函数的源代码允许通过IPython访问,可以使用“??”显示函数定义的完整源代码,例如在当前会话中定义的函数或从.py文件导入会话中的函数,如下:

如果不允许从IPython访问源代码,“??”只显示其文档字符串。

如果文档字符串的内容可以在当前窗口中完整显示,IPython将显示下一个In[]提示符。如果文档字符串太长无法在当前窗口全部显示,IPython会在窗口底部显示冒号(:)表示还有更多内容,按空格键可以显示下一屏。使用向上或向下方向键可以在文档字符串中向后或向前导航。IPython在文档字符串的末尾显示(END)。在任何“:”或(END)提示符处按q(表示quit)可返回到下一个In[]提示。如需了解IPython的功能,可以在任何In[]提示符下键入?,按Enter键,然后阅读帮助文档的概述。