匿名函数lambda

Python使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因,在调用时绕过函数的栈分配。其语法是:

lambda [arg1[, arg2, ... argN]]: expression

其中,参数是可选的,如果使用参数的话,参数通常也会在表达式之中出现。

无参数
# 使用def定义函数的方法
def true():return True#等价的lambda表达式
>>> lambda :True
<function <lambda> at 0x0000000001E42518># 保留lambda对象到变量中,以便随时调用
>>> true = lambda :True
>>> true()
True

一个参数 
# 使用def定义的函数
def add( x, y ):return x + y# 使用lambda的表达式
lambda x, y: x + y# lambda也允许有默认值和使用变长参数
lambda x, y = 2: x + y
lambda *z: z# 调用lambda函数
>>> a = lambda x, y: x + y
>>> a( 1, 3 )
4
>>> b = lambda x, y = 2: x + y
>>> b( 1 )
3
>>> b( 1, 3 )
4
>>> c = lambda *z: z
>>> c( 10, 'test')
(10, 'test')

lambda是单个的表达式,不是一个代码块 lambda的设计是为了满足简单函数的场景,仅能封装有限的逻辑,有复杂逻辑的情况有def来处理,所以lambda的功能要比def小的多  

lambda表达式是可以嵌套的(闭包)

>>> action = (lambda x : (lambda y : x + y))
>>> a = action(10)
>>> a(5)
15

匿名函数的使用  

匿名函数通常被用作高阶函数(higher-order function,参数为函数的函数)的参数。比如,几个内置函数:filter(),map(),reduce()。下面我们分别看看这几个函数的用法及达到相同效果的python另一种特征的用法

filter函数

>>> list = [1, 2, 3]
>>> result = filter(lambda x: x%2==0, list)
>>> result
[2]
>>> result = [x for x in list if x%2==0]
>>> result
[2]

map函数

>>> result = map(lambda x: x*2, list)
>>> result
[2, 4, 6]
>>> result = [x*2 for x in list]
>>> result
[2, 4, 6]

reduce函数

>>> result = reduce(lambda x, y: x+y,list)
>>> result
6
>>> result = sum(list)
>>> result
6

跳转表(jump table) 

lambda的另一种用法是用来编写跳转表,也就是行为列表或字典,能按需执行特定的动作。

>>> key = "get"
>>> {"abc":(lambda : 2 + 2),"bcd" : (lambda : 3 + 3), "get" : (lambda : 4 + 4)}

[key]()
8

  

注意问题:

x = 10
a = lambda y: y + xx = 20
b = lambda y: y + x#猜想一下:a(10) 和 b(10)返回的结果是什么?如果你认为结果是20 和 30,那么就错了print(a(10))  ##输出:30print(b(10))  ##输出:30

lambda表达式中的x是一个自由变量, 是在运行时绑定值,而不是定义时就绑定,即lambda表达式中的x是执行时的值,这与函数的默认值参数定义是不同的。例如:

x = 15
print(a(10))  ##输出:25x = 3
print(a(10)) ##输出:13

如果想让匿名函数,在定义时就捕获到参数值,可以将那个参数值定义成默认参数即可,例如:

m = 4
c = lambda n, m = m: m + nprint(c(10))  ##输出:14m = 2
print(c(10))  ##输出:14

  

有时候,可能会不恰当的使用lambda表达式。 比如,通过在一个循环或列表推导中创建一个lambda表达式列表,并期望函数能在定义时就记住每次的迭代值。例如:

funcs = [lambda x: x+n for n in range(3)]
for f in funcs:print(f(0))# 2
# 2
# 2

但是实际效果是,n的值为迭代的最后一个值。将参数值设置为默认参数,才能得到想要的效果,修改代码如下:

funcs = [lambda x, n = n: x+n for n in range(3)]
for f in funcs:print(f(0))# 0
# 1
# 2

  

转载于:https://www.cnblogs.com/a-ant/p/11030145.html

(二十)python 3 匿名函数相关推荐

  1. Python中匿名函数与内置高阶函数详解

    大家好,从今天起早起Python将持续更新由小甜同学从 初学者的角度 学习Python的笔记,其特点就是全文大多由 新手易理解 的 代码与注释及动态演示 .刚入门的读者千万不要错过! 很多人学习pyt ...

  2. python爬虫进阶案例,Python进阶(二十)-Python爬虫实例讲解

    #Python进阶(二十)-Python爬虫实例讲解 本篇博文主要讲解Python爬虫实例,重点包括爬虫技术架构,组成爬虫的关键模块:URL管理器.HTML下载器和HTML解析器. ##爬虫简单架构 ...

  3. python 中匿名函数的使用

    一.概述 在python3中的匿名函数是用来处理一些简单的逻辑,简单的功能的,这样可以节省栈内存,在使用场景中,很多情况是用于某个函数的参数,或者一些只需要一句话的逻辑,接下来让我们看看匿名函数的使用 ...

  4. Python的匿名函数

    Python的匿名函数 一.前言 二.匿名函数语法格式 三.匿名函数实例应用 一.前言   匿名函数是指没有名字的函数,它主要应用在需要一个函数.但是又不想费神去命名这个函数的场合.通常情况下,这样的 ...

  5. python在匿名函数作和_跟光磊学Python开发-匿名函数函数和高阶函数

    跟光磊学Python开发-匿名函数函数和高阶函数 跟光磊学Python开发-匿名函数函数和高阶函数跟光磊学Python开发 匿名函数 匿名函数就是函数定义时没有名字的函数,也称为匿名表达式. 普通函数 ...

  6. python的匿名函数返回值_Python匿名函数返回值输出问题望指点

    该段的匿名函数作为返回值返回,那请问可以输出对应的值吗?小白途中!望各位指点! def build(x, y): return lambda: x * x + y * y 1.匿名函数在一定意义上应该 ...

  7. GPS从入门到放弃(二十六) --- RTKLIB函数解析

    GPS从入门到放弃(二十六) - RTKLIB函数解析 为了贴合这个系列的标题"从入门到放弃",在入门之后现在就要放弃此方向了.虽然感觉遗憾,暂时也没有办法.在此附上此系列最后一篇 ...

  8. python基础十四之匿名函数

    匿名函数 处理简单问题的简化函数,关键字lambda. # 格式:函数名 = lambda 参数:返回值 anonymity = lambda s: s ** 0.5 print(anonymity( ...

  9. python十六:lambda匿名函数

    # 匿名函数 func = lambda x:x+10 v = func(10) print(v)# 将多个值返回 func = lambda: ('袁绍','沮授','田丰','颜良','文丑') ...

最新文章

  1. 还在纠结垃圾分类问题?带你用Python感受ImageNet冠军模型SENet的强大
  2. java什么是最终类型_golang和java,谁才是最终答案?
  3. 【测试点0分析】1009 Product of Polynomials (25 分)
  4. python yield from yield_python yield和yield from用法总结详解 python yield和yield from用法总结...
  5. Android 应用开发(17)---应用权限
  6. css 对齐方式 分类
  7. Spring中的jar包详解
  8. 于的繁体字有几种写法_“人”字繁体字有几种写法?
  9. TabLayout 不显示下划线
  10. 手机游戏的分析,设计,思考
  11. 对接天猫精灵X1 (https 的申请)
  12. Python 人工智能入门须知
  13. 图像处理(7)--高斯模糊原理
  14. 佳能r3和佳能r5哪个好
  15. LoadLibrary failed with error 1114:动态链接库(DLL)初始化例程失败 解决方法
  16. uni--ReferenceError plus is not defined
  17. 计算机c盘小了,为什么电脑C盘空间越来越小?
  18. java 断网处理_如何处理浏览器的断网情况?
  19. 视频去水印工具推荐-视频去水印步骤
  20. 自行车(山地车)拆脚踏

热门文章

  1. [导入]一再的变故,终于决定何去何从.
  2. 计算机机房t4,机房等级-T2-T3-T4-如何划分
  3. android fragment界面滑动切换效果,Android App中使用ViewPager+Fragment实现滑动切换效果...
  4. python 矩阵元素相加_Numpy中元素级运算
  5. java 调用 ictclas50_1-Ictclas50分词系统ForJava
  6. 中微CMS32 Keil环境搭建
  7. 在给定约束下可以使用a,b和c形成的字符串数
  8. 什么是alpha测试_什么是ALPHA?
  9. 如何在React JS组件和React JS App中添加CSS样式?
  10. 编写一个函数,计算下式当n=10和n=100的值。