lambda
由浅入深讲解lambda,所有的例子都在python2.7中测试通过
1、第一个例子
def identity(x):
return x
a = lambda x: x + 1
有上面的分析可得,lambda分为三个部分:
关键字: lambda
A bound variable: x (lambda函数的参数)
A body: x
2、lambda在python中是什么类型的?
print type(lambda x: x)
执行结果
<type 'function'>
可以知道lambda
在python中是function
类型,所以根据这个,我们可以很灵活的用lambda
比如
- 可以命名
my_lambda = lambda x: x + 1
print my_lambda(2)
- 可以立即执行
print (lambda x: x + 1)(8)
- 可以有很多个参数
full_name = lambda first, last: 'full name ' + first + last
print full_name('william', ' x_f_wang')
- 返回多个参数
shang_yushu = lambda x, y: (x / y, x % y)
print shang_yushu(2, 3)
- lambda嵌套,也叫
higher-ordeer functions
,如filter() ,min(), and max()等,都是内置的higher-ordeer functions
high_ord_func = lambda x, func: x + func(x)
print high_ord_func(2, lambda x: x * x)
print high_ord_func(2, lambda x: x + 3)
3、匿名函数
在python中,匿名函数anomyous functions
就是用lambda
关键字来写的,总之python中的lambda
几乎和普通的函数normal function
一摸一样
4、lambda与普通函数的区别
- 看一下TraceBack
1.1 lambda
执行结果div_zero = lambda x: x / 0 div_zero(2)
可以看到lambda给出的就是一个关键字Traceback (most recent call last): File "lambdaTest.py", line 1, in <module> div_zero(2) File "lambdaTest.py", line 1, in <lambda> div_zero = lambda x: x / 0 ZeroDivisionError: integer division or modulo by zero
lambda
1.2 普通函数
normal function
执行结果def div_zero(x): return x / 0 div_zero(2)
可以看到普通函数给出的是函数名Traceback (most recent call last): File "lambdaTest.py", line 72, in <module> div_zero(2) File "lambdaTest.py", line 71, in div_zero def div_zero(x): return x / 0 ZeroDivisionError: integer division or modulo by zero
div_zero
所以结论,在TraceBack的时候,普通的函数能给出更加精确的log
5、语法上的一些限制
1、不能包含statements
,如print
,assert
等
# 这样写就是错的
print (lambda x: assert / return x == 2 )(2)
2、只能由一个语句,这个没啥好说的
3、不支持type annotations
,类型注释,python中可以通过类型注释来达到java中的参数类型效果
def test(first):
"""
:rtype: int (说明返回类型是 int)
:type first: int (说明first类型是 int)
"""
return first
a = "" # type: str (说明a类型是 str)
a = test(1) # (这一句编译器就会提示报错)
5、参数的使用方法
1、Positional arguments
print ( lambda x, y ,z: x + y + z)(1, 2, 3)
2、Named arguments (sometimes called keyword arguments)
print ( lambda x, y, z=3: x + y + z)(1, 2)
3、Variable list of arguments (often referred to as varargs)
print ( lambda x, y=1, z=3: x + y + z)(1, y=2)
4、Variable list of keyword arguments
print ( lambda *args: sum(args) )(1, 2, 3)
5、Keyword-only arguments
print ( lambda **kwargs: sum(kwargs.values()))(a=1, b=2, c=3)
然后后面就写了一大堆lambda可以用到的地方,用来用去,也都是为了说明,凡是function可以用的,lambda都可以用
比如decorator的修饰器,closure等,一个比较有意思的例子:
numbers = 'one', 'two', 'three'
funcs = []
for n in numbers:
funcs.append(lambda n=n: n)
for f in funcs:
print f()
lambda expression abuses
说lambda不能滥用,的波的,的波的…
接下来就是仁者见仁,智者见智了
If you find yourself trying to overcome something that a lambda expression does not support,
this is probably a sign that a normal function would be better suited.
- It doesn’t follow the Python style guide (PEP 8)
- It’s cumbersome and difficult to read.
- It’s unnecessarily clever at the cost of difficult readability.