在Python语言经常用到函数,有些基础的函数是官方提供的,称为内置函数(Built-in Functions, BIF)。但是很多函数都是自定义的,这些自定义的函数必须先定义后调用,也就是定义函数必须在调用函数之前,否则会有错误发生。
自定义函数的语法格式如下。
在Python中定义函数时,关键字是def,函数名需要符合标识符命名规范。多个参数列表之间可以用逗号“,”分隔,当然函数也可以没有参数。如果函数有返回数据,就需要在函数体最后使用return语句将数据返回;如果没有返回数据,则函数体中可以使用return None或省略return语句。
定义函数的示例代码如下。
示例代码运行后,在控制台输出结果如下。
代码解释如下。
·代码第①行是定义计算长方形面积的函数rectangle_area,它有两个参数,分别是长方形的宽和高,width和height是参数名。
·代码第②行通过return返回函数计算结果。
·代码第③行调用了rectangle_area函数。
有的时候在使用函数时不需要给函数分配一个名字,这就是匿名函数。Python语言中使用lambda表达式表示匿名函数,声明lambda表达式语法如下。
在上述代码中,lambda是关键字声明,这是一个lambda表达式;参数列表与函数的参数列表是一样的,但不需要用小括号括起来;冒号后面是lambda体,lambda表达式的主要代码在此处编写,类似于函数体。
提示
lambda体部分不能是一个代码块,不能包含多条语句,只能有一条语句,语句会计算一个结果返回给lambda表达式,但是与函数不同的是,不需要使用return语句返回。与其他语言中的lambda表达式相比,Python中提供的lambda表达式只能进行一些简单的计算。
lambda表达式的示例代码如下。
示例代码运行后,在控制台输出结果如下。
代码解释如下。
·代码第①行lambda表达式实现两个整数相加,其中a, b是lambda表达式参数列表,(a+b)是lambda体,即匿名函数体。
·代码第②行lambda表达式实现两个整数相减,其中a, b是lambda表达式参数列表,(a+b)是lambda体,即匿名函数体。
·代码第③行调用calculate_fun函数返回f1对象,f1是一个函数对象,该函数事实上是代码第①行定义的lambda表达式。
·代码第④行调用calculate_fun函数返回f2对象,f2也是一个函数对象,该函数事实上是代码第②行定义的lambda表达式。
·代码第⑤行是打印f1对象的数据类型,从输出结果可见,函数类型是“function”。
·代码第⑥行是调用f1对象指向的函数。事实上就是调用代码第①行定义的lambda表达式。
·代码第⑦行是调用f2对象指向的函数。事实上就是调用代码第②行定义的lambda表达式。
在数据处理时经常用到个重要的函数:filte和map。
过滤操作使用filter函数,它可以对可迭代对象的元素进行过滤,filter函数语法如下。
其中参数function是一个函数,参数iterable是可迭代对象。filter()函数调用时iterable会被遍历,它的元素被逐一传入function函数,function函数返回布尔值。在function函数中编写过滤条件,结果为True的元素被保留,结果为False的元素被过滤掉。
下面通过示例介绍一下filter函数的使用,示例代码如下。
示例代码运行后,输出结果如下。
代码解释如下。
·代码第①行调用filter函数过滤users列表,过滤条件是T开头的元素,lambda u: u.startswith ('T')是一个lambda表达式,它提供过滤条件。注意:filter函数返回的并不是一个列表对象,而是filter对象。
·代码第②行将filter函数返回的filter对象转换为列表对象,这个转换是使用list函数实现的。
提示
代码第③行再次从filter对象中转换列表数据,但是从运行的结果可见,返回的users3列表对象是空的。这是因为filter对象是一种生成器,生成器特别适合用于遍历一些大序列对象,它无须将对象的所有元素都载入内存后才开始进行操作,仅在迭代至某个元素时才会将该元素载入内存。因此filter对象不能多次提取,由于在上述示例以及代码第②行均提取一次列表数据,因此在代码第③行提取数据时返回的列表是空的。
映射操作使用map函数,它可以对可迭代对象的元素进行变换,map函数语法如下。
其中参数function是一个函数,参数iterable是可迭代对象。map函数调用时iterable会被遍历,它的元素被逐一传入function函数,在function函数中对元素进行变换。
下面通过示例介绍map函数的使用,示例代码如下。
示例代码运行后,在控制台输出结果如下。
代码解释如下。
·代码第①行调用map函数将users列表元素转换为小写字母,变换时列表中每一个元素都会调用一个匿名函数,即lambda表达式,从而将字列表中的每一个元素都转换为小写字符。map函数返回的不是一个列表对象,而是一种map对象。注意:map对象也是生成器对象,不能反复提取数据。
·代码第②行将map函数返回的map对象转换为列表对象,这个转换是使用list函数实现的。