lambda函数的应用

匿名函数 : 需要一个函数,但是又不想费神去命名一个函数的场合下使用。
闭包 :一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。
lambda是一个闭包函数。
一、lambda表达式的作用:

  1. 省下定义函数的过程。
  2. 对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,使用lambda就不需要考虑命名问题。
  3. 简化代码的可读性,由于普通的函数阅读经常要跳到开头def定义部分,使用lambda函数可以省去这样的步骤。

二、两个重要的BIF

1.filter(function or None,iterable):两个参数为函数和可迭代的序列,函数定义了过滤的规则,默认过滤出真的部分。
例:利用filter()和lambda表达式快速求出100以内所有3的倍数

list(filter(lambda x:x%3 == 0,range(1,100)))

使用列表推导式代替filter()和lambda组合

[x for x in range(1,100)if x%3==0]  

2.map(function or None,iterable):同filter()的两个参数相同,这个内置函数的作用是:将序列的每一个元素作为函数的参数进行运算加工,直到可迭代序列的每个元素都加工完毕,返回所有加工后的元素构成的新序列。
使用zip会将两数以元祖的形式绑定在一块

>>>list(zip([1,3,5,7,9],[2,4,6,8,10])) 
>[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]  

打包的形式是灵活多变的列表而不是元祖(希望是[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]这种形式)

list(map(lambda x,y : [x,y],[1,3,5,7,9],[2,4,6,8,10]))

3.在函数中应用

>>>list1=[3,5,-4,-1,0,-2,-6]
>>>sorted(list1,key=lambda x:abs(x))
[0,-1,-2,3,-4,5,-6]
>>>list1=[3,5,-4,-1,0,-2,-6]
>>>def foo():
... return abs(x)
...
>>>sorted(list1,key=foo)
[0,-1,-2,3,-4,5,-6]

三、c++的应用
[capture](parameters)->return-type{body}

[](int x, int y) -> int { int z = x + y; return z + x; }

本例中,一个临时的参数 z 被创建用来存储中间结果。如同一般的函数,z 的值不会保留到下一次该不具名函数再次被调用时。
如果 lambda 函数没有传回值(例如 void),其回返类型可被完全忽略。
在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。 与JavaScript闭包不同,C++变量传递有传值和传引用的区别。可以通过前面的[]来指定:

[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值