4.2 函数定义
在本书前面章节的示例中已经调用过许多内置函数(int
、float
、print
、input
、type
、sum
、len
、min
和max
)和statistics
模块中的一些函数(mean
、median
和mode
),每个函数都执行了一项明确定义的任务。除了这些已经定义好的函数外,我们还会经常定义和调用自定义函数。下面的代码段定义了一个square
函数,用于计算其参数的平方,然后调用了两次square
函数,第一次计算int
值7
的平方(得到int
值49
),第二次计算float
值2.5
的平方(得到float
值6.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键,然后阅读帮助文档的概述。