Python网络爬虫实战(第2版)
上QQ阅读APP看书,第一时间看更新

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内置函数。