2.4 Python内置函数
自行设置函数很简单,但用户不可能将所有常用的功能都设置成函数。Python很贴心地将一些常用的功能设置成了内置函数。这些函数无须从模块中导入,也无须定义就可以在任意位置直接调用。
2.4.1 常用内置函数
一般常用的内置函数如下:
- abs(-1):求绝对值,返回1。
- max([1,2,3]):求序列中最大值,可以是列表或元组。
- min((2, 3, 4)):求序列中最小值,可以是列表或元组。
- divmod(6, 3):取模,返回一个元组,包含商和余数。
- int(3.9):转换成整数,去尾转换。
- float(3):转换成浮点数。
- str(123):转换成字符串。
- list((1, 2)):元组转换为列表。
- tuple([1, 2]):列表转换成元组。
- len([1, 3, 5]):求序列长度,可以是列表或元组。
这些都是比较简单常见的函数,执行结果如图2-21所示。
图2-21 Python简单内置函数
Python内置函数当然不止这些,但常用的大致就是这些了。基本无须刻意记忆,多使用几次自然就记得了。
2.4.2 高级内置函数
有简单的内置函数,当然也有相对高级一点的内置函数。本小节说明最常用的几个高级内置函数,即lambda、map、filter、reduce。
(1)lambda函数。在Python中,lambda的作用是定义一个匿名函数。有时候程序需要执行一个功能,但这个功能非常简单,也不是一个常用功能(例如输入一个数字,返回这个数字乘2加1)。没有必要为此专门去定义一个函数,此时就可以使用lambda函数。在Python环境下执行命令:
f = lambda x: x*2 + 1 f(3) f(5)
执行结果如图2-22所示。
图2-22 Python高阶函数lambda
lambda函数可以简化程序,节约资源。如今计算机资源很少有不足的情况,也可以定义一个函数来替代lambda。
(2)map函数。map,从名字上就可以看出是一一映射的意思。通常一般函数的映射是输入变量,通过指定的关系映射,返回的也是一个变量。map稍有不同,它要求输入的变量是一个函数和一个序列(通常是列表,也可以是元组或者生成器),通过一个定义的函数对序列中的每个元素进行一一映射,返回的是一个列表(map并不改变作为参数的列表或元组,但返回的一定是列表)。在Python环境下执行命令:
def f(x): return x*x def printSeq(seq): for i in seq: print(“%d “ %i, end=’’) print(end=’\n’) li = [1, 2, 3, 4, 5, 6, 7, 8, 9] s = (x for x in range(1,10)) printSeq(li) printSeq(s) printSeq(map(f, li)) printSeq(map(f, s)) printSeq(map(lambda x:x*x, li)) printSeq(map(lambda x:x*x, s))
执行结果如图2-23所示。
图2-23 Python高阶函数map
使用map函数对序列(列表或元组、生成器)元素一一映射。不用每次都使用for循环,精简了代码,使代码更加通俗易懂。
(3)filter函数。顾名思义filter主要用于过滤。基本与map函数相似,不同的是它添加了一个限定条件(不然为什么叫过滤),符合这个条件的才会被输出,不符合的则去掉。与map函数相同的是,它输入的参数同样是一个函数和序列(可以是元组和生成器)。由输入参数中的函数来判断序列中的哪些元素可以通过返回、哪些直接去掉,最后返回的也只能是一个新的列表。在Python环境下执行命令:
def f1(x): if x%2 == 1: return x else: pass def printSeq(seq): for i in seq: print("%d " %i, end=") print(end='\n') li = [x for x in range(1, 10)] type(li) g = (x for x in range(1, 10)) type(g) printSeq(li) printSeq(g) printSeq(filter(f1, li)) printSeq(filter(lambda x:x%2==1, li)) printSeq(filter(f1, g)) printSeq(filter(lambda x:x%2==1, g))
执行结果如图2-24所示。
图2-24 Python高阶函数filter
在使用filter函数时,要注意代入参数。检查序列与函数是否匹配。比如lambda和简化后的函数,虽然使用比较方便。把列表作为参数时都没问题,但把生成器作为参数就有可能无法返回。
(4)reduce函数。在Python 2中reduce是内置函数,但在Python 3中rudece被放置到functools模块中了。reduce是减少、缩小的意思。reduce函数针对的也是序列,参数同样是一个函数和一个序列(可以是列表、元组,生成器不行)。作为reduce参数的函数必须是输入两个元素、输出一个元素的函数。只有这样的函数才能缩小序列。作为reduce参数的这个序列中必须包含2个以上的元素,否则也没必要缩小序列了。reduce的运作过程大致是先取出序列中的前2个元素,作为函数的参数,等待函数的返回值;然后将这个返回值与序列中的第3个元素作为函数的参数,等待函数的返回值……以此类推。这个过程类似于递归。既然类似于递归,正好可以处理数学中的阶乘(Python中并没有直接的阶乘函数),也可以用于序列求和。两者都是将多个数字“合并”成一个数字。在Python环境下执行命令:
from functools import reduce li = [x for x in range(1,,5)] li tu = tuple(li) tu reduce(lambda x, y: x*y, li) reduce(lambda x, y: x*y, tu) reduce(lambda x, y: x+y, tu) reduce(lambda x, y: x+y, li) sum(li) sum(tu)
执行结果如图2-25所示。
图2-25 Python高阶函数reduce
Python高阶函数并不常见。这是因为总有替代函数可以使用,但就简洁而言,Python内置函数已经达到了目前可以做到的极致,而且内置函数使用快速方便,如果没有特殊要求,可以考虑使用Python内置函数。