摘自:https://www.cnblogs.com/xisheng/p/7301245.htmlhtml
lambda函數的語法只包含一個語句,以下: lambda arg1,arg2,.....argn:expression(主要是看下面的例子)
代碼示例:python
#-*- coding:utf-8 -*- #__author__ = "www.iplaypy.com" # 普通python函數 def func(a,b,c): return a+b+c print func(1,2,3) # 返回值爲6 # lambda匿名函數 f = lambda a,b,c:a+b+c print f(1,2,3) # 返回結果爲6
# 你們注意觀察上面的Python示例代碼,f = lambda a,b,c:a+b+c 中的關鍵字lambda表示匿名函數,
# 冒號:以前的a,b,c表示它們是這個函數的參數。
# 匿名函數不須要return來返回值,表達式自己結果就是返回值。express
(如下是我複製過來的一些代碼,正是經過這些代碼讓我對匿名函數有了一個比較深刻的瞭解,因此建議你們認真看看,)函數
無參匿名函數:
------
>>> t = lambda : True #分號前無任何參數
>>> t()
True
等價於下面的def定義的函數
>>> def func(): return True
>>> func()
True
------
>>> s = "this is\na\ttest" #建此字符串按照正常情形輸出
>>> s
'this is\na\ttest'
>>> print s.split() #split函數默認分割:空格,換行符,TAB
['this', 'is', 'a', 'test']
>>> ' '.join(s.split()) #用join函數轉一個列表爲字符串
'this is a test'
等價於
>>> (lambda s:' '.join(s.split()))("this is\na\ttest")
帶參數匿名函數
>>> lambda x: x**3 #一個參數
>>> lambda x,y,z:x+y+z #多個參數
>>> lambda x,y=3: x*y #容許參數存在默認值
匿名函數調用
#直接賦值給一個變量,而後再像通常函數調用
------
>>> c = lambda x,y,z: x*y*z
>>> c(2,3,4)
24
------
>>> c = lambda x,y=2: x+y #使用了默認值
>>> c(10) #不輸的話,使用默認值2
12
------
>>> a = lambda *z:z #*z返回的是一個元祖
>>> a('Testing1','Testing2')
('Testing1', 'Testing2')
------
>>> c = lambda **Arg: Arg #arg返回的是一個字典
>>> c()
{}
#直接後面傳遞實參
------
>>> (lambda x,y: x if x> y else y)(101,102)
102
------
>>> (lambda x:x**2)(3)
9
#lambda返回的值,結合map,filter,reduce使用
>>> filter(lambda x:x%3==0,[1,2,3,4,5,6])
[3, 6]
等價於下面的列表推導式
>>> l = [x for x in [1,2,3,4,5,6] if x%3==0]
>>> l
[3, 6]
嵌套使用
#lambda嵌套到普通函數中,lambda函數自己作爲return的值
------
>>> def increment(n):
... return lambda x: x+n
...
>>> f=increment(4)
>>> f(2)
6
------
>>> def say():
... title = 'Sir,'
... action= lambda x: title + x
... return action
...
>>> act = say()
>>> act('Smith!')
'Sir,Smith!'
大量例子:
例01: 字符串聯合,有默認值,也能夠x=(lambda...)這種格式
>>> x = (lambda x="Boo",y="Too",z="Zoo": x+y+z)
>>> x("Foo")
'FooTooZoo'
例02: 和列表聯合使用
>>> L = [lambda x:x**2,\
lambda x:x**3,\
lambda x:x**4]
>>> for f in L:
... print f(2)
...
4
8
16
也能夠以下面這樣調用
>>> print L[0](3)
9
例03: 和字典結合使用
>>> key = 'B'
>>> dic = { 'A': lambda: 2*2,\
... 'B': lambda: 2*4,\
... 'C': lambda: 2*8}
>>> dic[key]()
8
例04: 求最小值
>>> lower = lambda x,y: x if x<y else y
>>> lower('aa','ab')
'aa'
例05: 和map及list聯合使用
>>> import sys
>>> showall = lambda x:list(map(sys.stdout.write,x))
>>> showall(['Jerry\n','Sherry\n','Alice\n'])
Jerry
Sherry
Alice
>>> showall(['Jerry','Sherry','Alice'])
JerrySherryAlice
等價於下面
>>> showall = lambda x: [sys.stdout.write(line) for line in x]
>>> showall(('I\t','Love\t','You!'))
I Love You![None, None, None]
例06: 在Tkinter中定義內聯的callback函數
import sys
from Tkinter import Button,mainloop
x = Button(text='Press me',
command=(lambda:sys.stdout.write('Hello,World\n')))
x.pack()
x.mainloop()
>>>
Hello,World!
Hello,World!
例07: lambda和map聯合使用,
>>> out = lambda *x: sys.stdout.write(' '.join(map(str,x)))
>>> out('This','is','a','book!\n')
This is a book!
例08: 判斷字符串是否以某個字母開頭
>>> print (lambda x: x.startswith('B'))('Bob')
True
-----
>>> Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
>>> B_Name= filter(lambda x: x.startswith('B'),Names)
>>> B_Name
['Bob', 'Barbara']
例09: lambda和map聯合使用:
>>> squares = map(lambda x:x**2,range(5))
>>> squares
[0, 1, 4, 9, 16]
例10. lambda和map,filter聯合使用:
>>> squares = map(lambda x:x**2,range(10))
>>> filters = filter(lambda x:x>5 and x<50,squares)
>>> filters
[9, 16, 25, 36, 49]
例11. lambda和sorted聯合使用
#按death名單裏面,按年齡來排序
#匿名函數的值返回給key,進來排序
>>> death = [ ('James',32),
('Alies',20),
('Wendy',25)]
>>> sorted(death,key=lambda age:age[1]) #按照第二個元素,索引爲1排序
[('Alies', 20), ('Wendy', 25), ('James', 32)]
例12. lambda和reduce聯合使用
>>> L = [1,2,3,4]
>>> sum = reduce(lambda x,y:x+y,L)
>>> sum
10
例13. 求2-50之間的素數
#素數:只能被1或被本身整除的數
>>> nums = range(2,50)
>>> for i in nums:
nums = filter(lambda x:x==i or x % i,nums)
>>> nums
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
例14. 求兩個列表元素的和
>>> a = [1,2,3,4]
>>> b = [5,6,7,8]
>>> map(lambda x,y:x+y, a,b)
[6, 8, 10, 12]
例15. 求字符串每一個單詞的長度
>>> sentence = "Welcome To Beijing!"
>>> words = sentence.split()
>>> lengths = map(lambda x:len(x),words)
>>> lengths
[7, 2, 8]
寫成一行:
>>> print map(lambda x:len(x),'Welcome To Beijing!'.split())
oop
部分參考玩蛇網:http://www.iplaypy.com/wenda/lambda.htmlthis
部分參考csdn:http://blog.csdn.net/csdnstudent/article/details/40112803spa