Python机器学习编程与实战
上QQ阅读APP看书,第一时间看更新

1.4 函数

在程序中,同一段代码可能要多次用到。如果代码由混杂冗余的流程控制语句组成,则可读性会变差。为提高代码的重用率及应用的模块性,Python提供了函数这一程序结构。函数是为了提高编程的效率而定义的一种代码部件,将需要重复使用的代码封装并加以注释,使用时可直接调用,并且不需要探究源码。使用函数这一工具,可以给编程带来很大的便利。

本节将介绍Python中与函数相关的知识,包括内置函数、自定义函数与匿名函数。

1.内置函数

内置函数是安装Python后无须调用任何库即可直接使用的函数,这些函数提供了编程所需的最基础的功能。Python中的内置函数多且全面,按属性和功能差异可以分为数据对象相关函数、数学计算函数、str相关函数、序列对象相关函数、I/O功能函数及查询与判断函数等。Python常用内置函数如表1-35所示。

表1-35 Python常用内置函数

2.自定义函数

除内置函数外,Python也支持用户自定义函数,可以提高编程效率。自定义函数对代码的阅读者也有好处,只需知道如何正确地传递参数、函数将返回什么样的值,就可以充分利用封装起来的复杂逻辑,从而增强代码的可读性与可用性。

(1)def语句

在Python中,一般使用def语句自定义函数。def语句的首行包括标识符def、函数名和圆括号,任何传入的参数都放在圆括号中;之后为函数的执行体,以冒号起始,换行缩进;如果函数有返回值,则以return表达式结束函数,不带return表达式的情况相当于返回None值;执行体的内容不能为空,至少要用pass来表示空语句,否则函数将无法执行。

def语句的基本语法格式如下。

def function(par1, par2, …): 
    suite 
    return expression 

def语句的参数及说明如表1-36所示。

表1-36 def语句的参数及说明

def可以视作创建函数的一个声明,该函数将创建名为function的函数;函数可以传入par1、par2等参数,并代入执行语句suite;expression是一段可执行代码,程序最终返回其执行结果。def语句中可以不包含suite,要对传入参数进行的操作可以放在expression中。

函数中的return语句用于返回结果对象,一旦遇到return语句,函数就执行完毕,并将结果返回,既使return后还有语句,也不会被执行,因此可以用不包含内容的return表达式结束函数。函数可以没有返回值,可以有一个返回值,也可以有多个返回值,返回值的数据类型也没有限制。

例如,使用def语句创建一个幂运算函数,如代码1-5所示。

代码1-5 使用def语句创建一个幂运算函数示例

使用def语句创建的自定义函数的输入与输出设定非常灵活,参数和返回值都可以有或没有,也可以有单个或多个参数或者返回值。尽管函数可以有多个返回值,但是实际上此时函数返回的是一个tuple。

(2)参数

参数的名称和位置一旦被确定,函数的接口定义就完成了。除正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,这使得函数定义的接口不仅可以处理复杂的参数,还能简化调用者的代码。在函数体内部的参数列表中,可以预先定义某些参数的值,称为默认参数。与之相应,非默认参数为不在函数体内预先给定默认值的参数。Python不允许带默认值的参数定义在没有默认值的参数之前,因为这样写是有歧义的。在Python中,函数的参数主要有三大类,如表1-37所示。

表1-37 函数参数的分类

函数的参数不需要声明数据类型,这也有一定的弊端,程序员可能会因不清楚参数的数据类型而输入错误的参数。所以自定义函数时,一般在开头注明函数的用途、输入和输出。

例如,使用def语句定义一个含有位置参数、默认参数、不定数量的位置参数和不定数量的关键字参数的自定义函数,示例如代码1-6所示。

代码1-6 使用def语句定义含有不同类型参数的自定义函数示例

由代码1-6可以发现参数放置的排列规律:默认参数必须放在非默认参数的后面,不定数量的位置参数需要放在位置参数后面,而不定数量的关键字参数需放在最后。

3.匿名函数

有时,不需要显式地定义函数,创建匿名函数可能会更加方便。所谓匿名函数,即没有具体名称的函数。在Python中,可以使用lambda语句来创建匿名函数,lambda的主体是一个表达式,而不是一个代码块,其函数体比使用def语句创建的简单很多。

使用lambda语句创建匿名函数的基本语法格式如下。

f = lambda par1, …, parn : exp 

lambda语句的参数及说明如表1-38所示。

表1-38 lambda语句的参数及说明

在lambda语句中,冒号前是函数参数,多个函数使用逗号分隔,冒号右边是返回值。创建匿名函数时不需要写return表达式,返回值是exp表达式代入参数后的结果,允许传入多个参数,但只能有一个返回值。匿名函数也是一个函数对象,因此可以把匿名函数赋值给一个变量,再利用变量调用该函数。

使用lambda语句创建匿名函数有一些优势:编写脚本时可以省去定义函数的过程,使代码变得精简;对于一些抽象的不会在其他地方复用的函数,给一个函数命名也是难题(需要避免重名),创建匿名函数则不需要考虑函数命名的问题。例如,使用lambda语句创建一个求平方的匿名函数,如代码1-7所示。

代码1-7 使用lambda语句创建一个求平方的匿名函数示例

lambda语句中的表达式可以含有结构语句,但比较受限制,多于两条分支的结构无法嵌入。构建包含分支结构的lambda语句示例如代码1-8所示。

代码1-8 构建包含分支结构的lambda语句示例