python内置高阶函数-lambda、zip、map、reduce、filter

时间:2022-05-01 20:19:57

1、 lambda 

  在Python中,lambda函数的函数体有且仅有一条语句,即返回值的表达式语句,它比def简单许多。格式如下:

返回函数名 = lambda 参数列表:函数返回值表达式语句

  参数列表是可以选择的,如果有多个参数,就用逗号将这些参数隔开。函数返回值的表达式语句不能含有循环、分支、return语句或yield语句,但是允许使用条件表达式。lambda函数的结果是一个匿名函数,当调用lambda函数时,返回的是表达式语句计算所得到的结果。

例:使用lambda函数计算两个数之和。
sum = lambda x, y: x + y
print(sum(1, 2))   

2、 zip 

  zip函数可以接受一系列可迭代的对象作为参数,调用zip函数时,它按顺序将这一些相对应的元素都变为一个个元组,再返回这些元组所组成的列表。

例:使用zip函数的实例。
x = [1, 2]
y = [3, 4]
z = [5, 6]
result= zip(x, y, z)
for n in result:
    print(n)

运行结果:
(1, 3, 5)
(2, 4, 6)

将打包结果解压。
unzip = zip(*result)
for n in unzip:
    print(n)
运行结果:
(1, 2)
(3, 4)
(5, 6)

3、 map

  map函数和reduce函数类似,都需要接收两个参数:一个映射函数,一个序列。但是map函数的工作原理与reduce函数不同,map函数是对序列中的每一个元素都调用映射函数,最终返回一个新的序列。格式如下:

最终序列 = map(映射函数,序列1[,序列2…])

  在map函数的参数中,可以存在着多个序列,但序列的个数取决于映射函数的参数个数。

例:使用map函数的实例。
list = [1, 2, 3, 4, 5]
def add(x):
    return x + 1
result = map(add, list)
for n in result:
    print(n)

运行结果:
2
3
4
5
6

   在上例中,映射函数是add()函数,由于add()函数只有一个参数x,所以map()函数中只能有一个序列参数,即list序列。调用map()函数的时候,将list序列中的所有元素都调用add()函数,计算结果以数组形式返回,然后通过for循环,打印出数组里的所有元素。

例: 使用map函数对两个序列进行操作的实例。
list1 = [1, 2, 3];
list2 = [4, 5, 6];
def add(x, y):
    return x*100 +y*10;
result = map(add,list1,list2);
for n in result:
    print(n);

运行结果:
140
250
360

4、 reduce

  reduce函数就是将指定的序列中每个元素按一定的规则调用指定函数,最后返回最终结果。格式如下:

最终结果 = reduce(映射函数,序列)

   要注意,从Python 2.6之后,reduce函数就从内置函数退变成了模块functools中的函数,想要使用reduce函数就必须要引用模块。

例:使用reduce函数的实例。
from functools import reduce
def func(x, y):
    return x + y
sum = reduce(func, [1, 2, 3, 4, 5])
print(sum)

运行结果:
15

   reduce函数的映射函数必须要有两个参数,在上述实例中,func()就是映射函数,用来计算两个数之和。调用reduce(func, [1, 2, 3, 4, 5])的时候,reduce函数将会做下述运算:

  先计算第一个和第二个参数:f(1,2),结果为3;

  再把结果和第三个参数计算:f(3, 3),结果为6;

  再把结果和第四个参数计算:f(6, 4),结果为10;

  再把结果和第五个参数计算:f(10, 5),结果为15;

  因为没有更多的参数了,结束计算,返回结果15。

5、 filter

  filter函数也和reduce函数类似,都需要接收两个参数,一个映射函数,一个序列。并且filter函数和map函数的工作原理相似,都是对序列中的每一个元素都调用映射函数,且可以存在着多个序列,但序列的个数取决于映射函数的参数个数。不同的是,map函数参数中的映射函数返回的是一个确定的值,而filter函数参数中的映射函数返回布尔值True或False。格式如下:

filter(映射函数,序列)
例:使用filter函数的实例。
def is_odd(x):
    return x % 2 == 1
result = filter(is_odd, [1, 2, 3, 4, 5, 6])
for n in result:
    print(n)

运行结果:
1
3
5

  在上例中,映射函数是is_odd()函数,如果参数x是奇数,则返回True,否则返回False。由于is_odd()函数只有一个参数x,所以filter()函数中只能有一个序列参数。调用filter()函数的时候,将序列中的所有元素都调用is_odd()函数,筛选出序列中的所有奇数,计算结果以数组形式返回,然后通过for循环,打印出数组里的所有元素。