Python进阶篇——lambda、map、filter、reduce高级函数的使用

OK,我们今天来简单讲一下Python中的几个高级函数,为什么说这是高级函数呢?因为它可以极大的减少我们的代码量,让我们的代码看起来更加的清爽,提高我们的开发速度;

 

用lambda创建匿名函数

在理解匿名函数之前,我们先来回顾下我们之前创建函数是怎么创建的:

def 函数名(参数1,参数2[,……]):
    函数主体
    return 返回值

标标准准的函数构建方法,但是有一个问题,当我们创建的函数只需要计算两个数相加之和时,我们最少也要写两行代码:

def sum_n(x,y):
    return x+y

而用lambda创建则只需要一行代码就可以搞定:

sum_n = lambda x,y:x+y

这个就是lambda的魅力所在,使用也是非常的简单,接下来我们就来讲解一下它的使用方法和优缺点:

lambda 参数列表:参数表达式
  1. 匿名函数,肯定是没有名字的,我们可以将它赋给一个对象,然后通过这个对象就可以实现函数功能
    sum_n = lambda x,y:x+y
    
    print(sum_n(1,2))
    
    # 输出结果:
    # 3
  2. 通过上面我们可以知道,lambda其主体就是一个表达式,既然可以赋给一个对象,那么我们可不可以赋给列表,当列表元素呢?
    func = [lambda x,y:x+y,lambda x,y:x-y,lambda x,y:x*y,lambda x,y:x/y]
    
    for fun in func:
        print(fun(1,2))
    
    # 输出结果:
    # 3
    # -1
    # 2
    # 0.5
  3. 同样的道理,我们应该可以将其赋给另一个函数
    sum_n = lambda x,y:x+y
    
    def sum_m(func,x,y,n):
        return func(x,y)-n
    
    print(sum_m(sum_n,1,2,6))
    
    # 输出结果:
    # -3
  4. 有一个邪恶的想法,如果我将lambda函数赋值给其他函数,那么会发生什么呢?
    print = lambda x:None
    
    print('test')
    
    # 输出结果:
    # 什么都没发生

    那么这就有了一个引申用法,我是否可以通过它来屏蔽某些函数功能;

那么,有优点就肯定有缺点,我们一一说一下:

  1. 主体是表达式,那么函数功能就不会非常复杂,只能够实现简单的功能;
  2. 在lambda中,是不支持异常处理的,那么当处理异常时,程序就会崩溃:
    sum_n = lambda x,y:x+y
    
    sum_n(1,'a')
    
    # 输出结果:
    # TypeError: unsupported operand type(s) for +: 'int' and 'str'

 

用map函数做函数功能的序列映射

这是什么意思呢?我们下面来举个栗子说明:

a = [1,2,3,4,5]
b = [3,5,6,2,7]
n = []

for i in range(5):
    n.append(a[i]+b[i])

print(n)

# 输出结果:
# [4, 7, 9, 6, 12]

我们正常来讲,想要将两个列表元素依次相加,需要这么几行代码,但是用map函数就方便啦:

def sum_n(x,y):
    return x+y

print(list(map(sum_n,[1,2,3,4,5],[3,5,6,2,7])))

# 输出结果:
# [4, 7, 9, 6, 12]

额,好像没有啥差别呀,不就是没用变量传参了嘛;不要着急,还记得lambda嘛,实现一行解决问题:

print(list(map(lambda x,y:x+y,[1,2,3,4,5],[3,5,6,2,7])))

# 输出结果:
# [4, 7, 9, 6, 12]

是不是很神奇,OK,现在要敲黑板了,我们来总结一下:
        map函数可以根据我们指定的函数功能,将若干序元素依次进行处理,最后返回的也是一个序列集合;

那么现在都是序列元素个数对等的情况,如果元素个数不对等会怎么样呢?

print(list(map(lambda x,y:x+y,[1,2,3,4,5],[3,5,6])))

# 输出结果:
# [4, 7, 9]

我们可以发现,没有报错,只进行了前三个元素处理;那么,我们可以得出,当序列元素不对等时,不对等部分就不会进行处理。

 

用filter函数对序列进行过滤

这个函数功能从字面上应该就可以理解,它就相当于一个筛子,可以将不符合要求的序列元素过滤掉,然后返回一个新的序列;

a = [1,2,3,4,5,6,7,8,9]

print(list(filter(lambda x:x%2==1,a)))

# 输出结果:
# [1, 3, 5, 7, 9]

从上面栗子的结果可以看出,上面的功能就是筛选出序列中所有的奇数,接下来我们讲解下函数的参数:

filter(判断函数,源序列))

# 判断函数的返回值我们就可以理解成判断条件

下面我们再来举个栗子:

import math

print(list(filter(lambda x:math.sqrt(x)%1==0,range(1,100))))
# lambda x:math.sqrt(x)%1==0
# 这里的x就是判断值
# math.sqrt(x)%1==0 就是判断条件
# range(1,100) 就是要进行筛选的源序列

# 输出结果:
# [1, 4, 9, 16, 25, 36, 49, 64, 81]

 

用reduce函数累计处理序列元素

这个函数还是还是不好理解的,下面我来举个栗子:

from functools import reduce    # 在Python3中我们不能直接拿来使用,要从functools中导入使用

print(reduce(lambda x,y:x+y,range(1,101)))

# 输出结果:
# 5050

上面的栗子就是非常经典的累加,将1-100的数字依次相加,最后得出一个结果:

reduce(处理函数,[a,b,c,d,e])

# 首先对a和b用函数进行处理,得出结果b1
# 然后对b1和c用函数进行处理,得出c1
# 一次类推
# 最后对d1和e用函数进行处理,得出最后的结果

我们可以理解成滚雪球,不断根据规则进行迭代处理,到最后一个元素处理完毕得到最终结果。

你可能感兴趣的:(Python)