sorted()、map()、filter()、reduce() 中的匿名函数:lambda

Python 中的匿名函数的关键字是 lambda,之后是一系列的参数,然后用冒号隔开,最后则是由这些参数组成的表达式。我们通过几个例子看一下它的用法:

>>> sqr = lambda x: x**2
>>> sqr(3)  # 9

对应的常规 def 函数这样定义:

>>> def sqr(x):
        return x**2
>>> sqr(3)  # 9

可以看到,匿名函数 lambda 和常规函数一样,返回的都是一个函数对象(function object)。

Python 主要提供了这么几个函数:sorted()map()filter()reduce(),它们通常结合匿名函数 lambda 一起使用。

  • 因为 lambda 表达式可以用在列表推导式中:

    >>> [(lambda x: x*x)(x) for x in range(10)]
    >>> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
  • lambda 作为 sorted() 函数的参数

    >>> s = [('w', 1), ('a', 3), ('c', 6)]
    >>> s.sort(key=lambda x: x[1])  # 按列表中元组的第二个元素排序
    >>> print(s)
    >>> [('w', 1), ('a', 3), ('c', 6)]
    
    >>> s_ = sorted(s, key=lambda x: x[0])  # 按列表中元组的第一个元素排序。sorted()不会改变 s本身
    >>> print(s_)
    >>> [('a', 3), ('c', 6), ('w', 1)]
    
  • lambda 作为 map() 函数的参数

    map(function, iterable) 函数表示,对 iterable 中的每个元素,都运用 function 这个函数,最后返回一个迭代器可供遍历。比如刚才列表的例子,要对列表中的每个元素乘以 2,那么用 map 就可以表示为下面这样:

    >>> s = [1, 2, 3, 4, 5]
    >>> list(map(lambda x: x**2, s))  # map()返回的是一个可迭代对象
    >>> [1, 4, 9, 16, 25]
    
  • lambda 作为 filter() 函数的参数

    filter(function, iterable) 函数和 map 函数类似,function 同样表示一个函数对象。filter() 函数表示对 iterable 中的每个元素,都使用 function 判断,并返回 True 或者 False,最后将返回 True 的元素组成一个迭代器可供遍历。

    举个例子,比如我要返回一个列表中的所有偶数,可以写成下面这样:

    >>> s = [1, 2, 3, 4, 5]
    >>> list(filter(lambda x: x % 2 == 0, s))
    >>> [2, 4]
    
  • lambda 可以作为 reduce() 函数的参数

    reduce(function, iterable) 函数通常用来对一个集合做一些累积操作。

    function 同样是一个函数对象,默认接收两个参数,表示对 iterable 中的每个元素以及上一次调用后的结果运用 function 进行计算,所以最后返回的是一个单独的数值。

    举个例子,我想要计算某个列表元素的乘积,就可以用 reduce() 函数来表示:

    >>> from functools import reduce  # python3 之后 reduce 函数放在了这
    >>> s = [1, 2, 3, 4, 5]
    >>> reduce(lambda x, y: x * y, l)  # 1*2*3*4*5 = 120
    >>> 120
    

    当然,filter()reduce() 的功能,也可以用 for 循环或者列表推导式来实现。

    通常来说,在我们想对集合中的元素进行一些操作时,如果操作非常简单,比如相加、累积这种,那么我们优先考虑 map()filter()reduce() 这类或者列表推导式的形式。

Python 中的匿名函数 lambda,它的主要用途是减少代码的复杂度。需要注意的是 lambda 是一个表达式,并不是一个语句;它只能写成一行的表达形式,语法上并不支持多行。匿名函数通常的使用场景是:程序中需要使用一个函数完成一个简单的功能,并且该函数只调用一次。

map()filter()reduce() 三个函数比其他形式(for 循环,列表推导式)的性能,效率是更优的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Skr.B

WUHOOO~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值