目录
2.普通Python函数和lambda函数之间的共性和细微差别
#1 map()、filter()、functools.reduce(),但现在实际上可以用更优雅的列表推导代替
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 = None,reverse = 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']