
5.2.4 模块的内置函数
Python提供了一个内联模块buildins。内联模块定义了一些开发中经常使用的函数,通过dir(buildins)可以查看内联模块中所有的内置函数,利用这些函数可以实现数据类型的转换、数据的计算、序列的处理等功能。下面将介绍内联模块中常用的函数。
1.apply()
Python3中移除了apply函数,所以不再可用了。调用可变参数列表的函数的功能只能使用在列表前添加*来实现。
2.filter()
filter()可以对某个序列做过滤处理,判断自定义函数的参数返回的结果是否为真来过滤,并一次性返回处理结果。filter()的声明如下所示。
class filter(object) filter(function or None, iterable) --> filter object
下面这段代码演示了filter()过滤序列的功能。从给定的列表中过滤出大于0的数字。
01 def func(x): # 定义func函数 02 if x > 0: # if判断 03 return x # 返回x的值 04 05 print (filter(func, range(-9, 10))) # 调用filter函数,返回的是filter对象 06 print(list(filter(func, range(-9, 10))) # 将filter对象转换为列表
【代码说明】第5行代码,使用range()生成待处理的列表,然后把该列表的值依次传入func()。func返回结果给filter(),最后将结果yield成一个iterable对象返回,可以进行遍历。输出结果如下。
<filter object at 0x0000019C68C88948>
直接打印出的是filter对象,无法看出其内容。第6行将其转换为列表。输出结果如下。
[1, 2, 3, 4, 5, 6, 7, 8, 9]
注意 filter()中的过滤函数func()的参数不能为空。否则,没有可以存储sequence元素的变量,func()也不能处理过滤。
3.reduce()
对序列中元素的连续操作可以通过循环来处理。例如,对某个序列中的元素累加操作。Python提供的reduce()也可以实现连续处理的功能。在Python2中reduce()存在于全局空间中,可以直接调用。而在Python3中将其移到了functools模块中,所以使用之前需要先引入。reduce()的声明如下所示。
reduce(func, sequence[, initial]) -> value
【代码说明】
·参数func是自定义的函数,在函数func()中实现对参数sequence的连续操作。
·参数sequence待处理的序列。
·参数initial可以省略,如果initial不为空,则initial的值将首先传入func()进行计算。如果sequence为空,则对initial的值进行处理。
·reduce()的返回值是func()计算后的结果。
下面这段代码实现了对一个列表的数字进行累加的操作。
01 def sum(x, y): # 定义sum函数 02 return x + y # 返回x + y的值 03 from functools import reduce # 引入reduce 04 print (reduce(sum, range(0, 10))) 05 print (reduce(sum, range(0, 10), 10)) 06 print (reduce(sum, range(0, 0), 10))
【代码说明】
·第1行代码,定义了一个sum()函数,该函数提供两个参数,执行累加操作。
·第4行代码,对0+1+2+3+4+5+6+7+8+9执行累加计算。输出结果为45。
·第5行代码,对10+0+1+2+3+4+5+6+7+8+9执行累加计算。输出结果为55。
·第6行代码,由于range(0,0)返回空列表,所以返回结果就是10。输出结果为10。
reduce()还可以对数字进行乘法、阶乘等复杂的累计计算。
注意 如果用reduce()进行累计计算,必须在sum中定义两个参数,分别对应加法运算符两侧的操作数。
4.map()
第4章使用了map()对tuple元组进行“解包”操作,调用时设置map()的第一个参数为None。map()的功能非常强大,可以对多个序列的每个元素都执行相同的操作,并返回一个map对象。map()的声明如下所示。
class map(object) map(func, *iterables) --> map object
【代码说明】
·参数func是自定义的函数,实现对序列每个元素的操作。
·参数iterables是待处理的序列,参数iterables的个数可以是多个。
·map()的返回值是对序列元素处理后的列表。
下面这段代码实现了列表中数字的幂运算。
01 def power(x): return x ** x # 定义power函数 02 print (map(power, range(1, 5))) # 打印map对象 03 print(list(map(power,range(1,5)))) # 转换为列表输出 04 def power2(x, y): return x ** y 05 print (map(power2, range(1, 5), range(5, 1, -1))) # 打印map对象 06 print(list(map(power2, range(1, 5), range(5, 1, -1)))) # 转换为列表输出
【代码说明】
·第1行代码定义了一个power()函数,实现了数字的幂运算。
·第2行代码把数字1、2、3、4依次传入函数power中,将计算结果yield成一个iterable对象,输出结果:
<map object at 0x0000020A24765148>
·第3行代码将map对象转换为列表然后打印出来,输出结果:
[1, 4, 27, 256]
·第4行代码,定义了一个power2()函数,计算x的y次幂。
·第5行代码,提供了两个列表参数。依次计算1^5、2^4、3^3、4^2,计算后的结果同样yield成一个iterable对象。输出结果:
<map object at 0x0000020A24765B48>
·第6行代码将map对象转换成为列表输出。输出结果:
[1, 16, 27, 16]
注意 如果map()中提供多个序列,则每个序列中的元素一一对应进行计算。如果每个序列的长度不相同,则短的序列后补充None,再进行计算。
常用内置函数一览表如表5-1所示。
表5-1 内置模块的函数
