Python lambda

Python lambda及匿名函数

1. lambda介绍

lambda是python中的一个关键字,实际开发中常用 lambda 表达式的方式创建匿名函数,比如 lambda a, b: a+b,表示定义了一个匿名函数,该函数包含a、b两个参数,并返回a与b的和。lambda表达式返回的是一个函数对象,可通过函数对象来调用定义的匿名函数,比如func = lambda a, b: a+b,func(2, 3)则表示调用lambda定义的匿名函数;(lambda a, b: a + b)(2, 3)则是另一种调用方式

func = lambda a, b: a + b
type(func)
<class 'function'>
func
<function <lambda> at 0x00000290F619FF78>
func(2, 7)
9
lambda a, b: a + b(2, 5)
<function <lambda> at 0x00000290F61DD798>
(lambda a, b: a + b)(2, 5)
7

2. 剖析lambda创建匿名函数

lambda定义匿名函数的格式为:lambda parameters: expression,其中parameters表示定义一个或多个参数,参数类型与def一样,支持普通参数、默认参数、可变参数、关键字参数。lambda定义的匿名函数等价于如下的函数定义:

def <lambda> (parametes):
    return expression
# <lambda>指函数名称 

def func1(a, b):                   <==>    lambda a, b: a + b
	return a + b

def func_name(a, b): 			   <==>    lambda a, b: a ** b
	return a ** b

3. lambda特点

  • lambda是一个表达式,而不是一个语句
    lambda_expr ::= "lambda" [parameter_list]: expression
    
  • lambda是只有一行的简单表达式,并不能扩展成一个多行的代码块
    Python文档说到,lambda不能包含语句,这是因为Python的语法框架无法处理嵌套在表达式中的语句。lambda可以接收多个参数,但只能有一个包含这些参数计算的表达式。这意味着lambda中不会含有if…elif… else 或者 try… except等语句,lambda的设计主要是用来计算简单的任务。

4. lambda使用场景

  • 一个小的功能函数,只需要一行就能完成,且只会被调用一次,比如要对整数列表中的所有元素添加存储单位的操作:
    >>> def add_unit(num):
            return '{}mb'.format(num)
    >>> map(add_unit, range(5))
    ['0mb', '1mb', '2mb', '3mb', '4mb']
    
    >>> map(lambda n: '{}mb'.format(n), range(5))
    ['0mb', '1mb', '2mb', '3mb', '4mb']
    # 可见,使用lambda的代码更加简洁
    
  • 编程中与高阶函数联合使用
    实际开发中,lambda更多的是与map、filter、reduce等高阶函数搭配使用,因为这些函数中需要接收函数对象作为参数,使用lambda达到了既定义函数又传递函数的目的,比如map(lambda x: x ** 2, range(5)),这里的lambda x: x **2先定义函数,然后将此函数对象作为参数传递给map;如果是def则需要首先在外部定义这个函数,而不能在map函数中直接通过def来定义,map(def…, range(5)),Python不允许这样的语法

5. lambdalambda注意点

  • lambda专注完成简单的任务,其表达式要易读
    不推荐在编码中为了使用lambda而将表达式写的很繁琐,就像Python文档中说到的reduce(lambda a, b: (0, a[1] + b[1]), items)[1]这个表达式,你能很快看出lambda函数的意图吗?答案是不能,所以对于复杂点的逻辑,最好不要用lambda
  • 程序中多处都会用一个小函数功能,则建议用def定义这个小函数 对列表中的数字求平方,lambda表达式为lambda n: n **
    2,简单,易读。如果程序中不止一处需要对数字求平方,若均使用lambda,则显得代码冗余
  • 开发中先def,后lambda
    在实际开发过程中,我倾向于把不管什么类型的函数均先通过def来定义,等程序开发接近尾声的时候,再依据简单任务、只用一次的原则看看把哪些def定义的函数可以替换成lambda匿名函数,并写上必要的注释
  • 谨慎使用lambda
    其实从Python文档函数式编程的说明部分可以了解到,文档作者倾向于不使用lambda,原因就是lambda的单个表达式、无法扩展多行代码块等自身的功能限制。所以我们一定要秉持小函数、简单任务、只用一次的原则来决定是否要用lambda,千万别写出了大家半天都看不太明白的lambda表达式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值