零基础学Python(第2版)
上QQ阅读APP看书,第一时间看更新

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 内置模块的函数