Python Lambda

目录

1.Lambda函数

2.普通Python函数和lambda函数之间的共性和细微差别

#1 字节码

#2 Traceback

#3 句法

#4 Decorators装饰器

#5 闭包

#6 Evaluation Time评估时间

#7 单元测试unittest

3.避免滥用

4.适合使用

#1 map()、filter()、functools.reduce(),但现在实际上可以用更优雅的列表推导代替

#2 sorted( )

#3 Monkey Patching


1.Lambda函数

 Lambda表达式组成部分:关键字lambda、参数、body

>>> lambda x : x**2
<function <lambda> at 0x0000000002EDF158>
>>> _(5)  
25
#在交互式解释器中,单个下划线(_)绑定到最后计算的表达式。

匿名函数,可以将lambda函数和参数括住来计算

>>> (lambda x : x**2)(5)
25

l可以分配名称,注意在定义时,函数名是没有括号的

>>> square = lambda x : x**2
>>> square(5)
25

多个参数时,逗号分隔

>>> add = lambda x,y : x+y
>>> add(4,5)
9

2.普通Python函数和lambda函数之间的共性和细微差别

#1 字节码

#lambda函数
>>> add = lambda x,y : x+y

#普通Python函数
>>> def add_common(x,y):
	return x+y

>>> type(add)
<class 'function'>
>>> type(add_common)
<class 'function'>

>>> import dis
>>> dis.dis(add) == dis.dis(add_common)
  1           0 LOAD_FAST                0 (x)
              2 LOAD_FAST                1 (y)
              4 BINARY_ADD
              6 RETURN_VALUE
  2           0 LOAD_FAST                0 (x)
              2 LOAD_FAST                1 (y)
              4 BINARY_ADD
              6 RETURN_VALUE
True

dis模块通过反汇编来支持CPython 字节码的分析,可见Python对这两个函数解释的字节码是相同的。但是您可能会注意到,命名是不同的:函数名是为使用def定义的函数添加的,而Python lambda函数被视为lambda。

#2 Traceback

#1
>>> zero=lambda x : x/0
>>> zero(2)
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    zero(2)
  File "<pyshell#28>", line 1, in <lambda>
    zero=lambda x : x/0
ZeroDivisionError: division by zero
>>> def zero(x):
	return x/0

#2
>>> zero(0)
Traceback (most recent call last):
  File "<pyshell#33>", line 1, in <module>
    zero(0)
  File "<pyshell#32>", line 2, in zero
    return x/0
ZeroDivisionError: division by zero

执行lambda函数时引发的异常的回溯仅将引起异常的函数标识为<lambda>,普通函数会导致类似的错误,回溯到函数名称div_zero

#3 句法

lambda函数不能包含任何语句。在lambda函数中,return、pass、assert或raise等语句将引发SyntaxError异常。

与普通函数相反,Python lambda函数是单个表达式。尽管lambda可以在表达式的主体中使用括号或多行字符串将表达式分布在多行上,但它仍是一个表达式

#4 Decorators装饰器

#5 闭包

#6 Evaluation Time评估时间

#7 单元测试unittest

>>> import unittest

>>> add = lambda x,y : x+y
>>> class Test_add(unittest.TestCase):
	def test_add(self):
		self.assertequal(add(10,31),41)

			
>>> unittest.main()
.
----------------------------------------------------------------------
Ran 1 test in 0.046s

OK

可以像常规函数一样对Python lambda进行测试

3.避免滥用

如果在专业Python代码的上下文中编写本文中的几个示例,将被视为滥用:

它不遵循Python风格指南(PEP 8);它既笨重又难读;这是不必要的聪明,代价是难以阅读。

4.适合使用

#1 map()、filter()、functools.reduce(),但现在实际上可以用更优雅的列表推导代替

#2 sorted( )

sorted( iterable*key = Nonereverse = False ),key指定一个参数的功能,该参数用于从iterable中的每个元素中提取一个比较键(例如key=str.lower)。默认值为None(直接比较元素)。

Python中的键函数是以参数键作为命名参数的高阶函数,key可以接收一个lambda函数:

>>> l=['id1','id30','id7','id12','id80','id78']
>>> sorted(l,key=lambda k : int(k[2:]))
['id1', 'id7', 'id12', 'id30', 'id78', 'id80']

#3 Monkey Patching

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值