lambda
函数是一种快速定义单行的最小函数,是从 Lisp
借用来的,可以用在任何需要函数的地方 。下面的例子比较了传统的函数定义def
与lambda
定义方式:
>>> def f ( x ,y):
... return x * y
>>> f ( 2,3 )
6
>>> g = lambda x ,y: x * y
>>> g ( 2,3 )
6
可以看到,两个函数得到的结果一样,而对于实现简单功能的函数来说,使用lambda
函数来定义更加精简灵活,还可以直接把函数赋值给一个变量,用变量名来表示函数名。
其实lambda函数在很多时候都是不需要赋值给一个变量的。
使用lambda函数还有一些注意事项: lambda
函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。 lambda
函数不能包含命令,包含的表达式不能超过一个。
下面简单演示一下如何使用lambda
函数实现自定义排序:
class People :
age = 0
gender = 'male'
def __init__ ( self , age , gender ):
self . age = age
self . gender = gender
def toString ( self ):
return 'Age:' + str ( self . age ) + ' /t Gender:' + self . gender
List = [ People ( 21 , 'male' ), People ( 20 , 'famale' ), People ( 34 , 'male' ), People ( 19 , 'famale' )]
print 'Befor sort:'
for p in List :
print p . toString ()
List . sort ( lambda p1 , p2 : cmp ( p1 . age , p2 . age ))
print ' /n After ascending sort:'
for p in List :
print p . toString ()
List . sort ( lambda p1 , p2 : - cmp ( p1 . age , p2 . age ))
print ' /n After descending sort:'
for p in List :
print p . toString ()
上面的代码定义了一个People
类,并通过lambda
函数,实现了对包含People
类对象的列表按照People
的年龄,进行升序和降序排列。运行结果如下:
Befor sort:
Age:21 Gender:male
Age:20 Gender:famale
Age:34 Gender:male
Age:19 Gender:famale
After ascending sort:
Age:19 Gender:famale
Age:20 Gender:famale
Age:21 Gender:male
Age:34 Gender:male
After descending sort:
Age:34 Gender:male
Age:21 Gender:male
Age:20 Gender:famale
Age:19 Gender:famale
lambda语句被用来创建新的函数对象,并且在运行时返回它们。
def make_repeater(n):
return lambda s: s*n
twice = make_repeater(2)
print(twice('word'))
print(twice(5))
wordword
10
它如何工作
这里,我们使用了make_repeater
函数在运行时创建新的函数对象,并且返回它。lambda
语句用来创建函数对象。本质上,lambda
需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print
语句也不能用在lambda
形式中,只能使用表达式。def与lambda的区别
它们的主要不同点是python def
是语句而python lambda
是表达式 ,理解这点对你了解它们很重要。 下面看看他们的应用吧。首先在python
里面语句是可以嵌套的,比如你需要根据某个条件来定义方法话,那只能用def
了。你用lambda
就会报错了。
a = 2
if a > 1 :
def info ():
print 'haha'
else :
def test ():
print 'test'
而有的时候你需要在python
表达式里操作的时候,那需要用到表达式嵌套,这个时候python def
就不能得到你想要的结果,那只能用python lambda
g = lambda x : x+2
info = [g(x) for x in range(10)]
print info
- 其他的区别:
1
python lambda
会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def
则会把函数对象赋值给一个变量。
2
python lambda
它只是一个表达式,而def
则是一个语句。