python基礎入門---Lambda函數用法詳解


以下內容為轉載: 作者:叫我小包總    https://www.jb51.net/article/169189.htm

1.為什么要用lambda函數?

先舉一個例子:將一個列表里的每個元素都平方。

先用def來定義函數,代碼如下

def sq(x):
  return x*x
  
map(sq,[y for y in range(10)])
 

再用lambda函數來編寫代碼

map(lambda x: x*x,[y for y in range(10)])

從這個簡單的例子,我們可以看出,用lambda函數首先減少了代碼的冗余,其次,用lambda函數,不用費神地去命名一個函數的名字,可以快速的實現某項功能,最后,lambda函數使代碼的可讀性更強,程序看起來更加簡潔。

從上面這個簡單的例子,也可以看出來lambda函數的語法是唯一的,其形式如下:

lambda argument_list:expersion

語法中的argument_list是參數列表,它的結構與Python中函數(function)的參數列表是一樣的,例如

a,b 
a=1,b=2
*args 
**kwargs 
a,b=1,*args 
空 
....

 

語法中的expression是一個關於參數的表達式,表達式中出現的參數需要在argument_list中有定義,並且表達式只能是單行的。比如以下的一些合法的表達式

1
None
a+b 
sum(a) 
1 if a >10 else 0
......

 

2.lambad函數的用法上面也講到了匿名函數的優點,那它到底有哪些用處呢?

(1)直接賦給一個變量,然后再像一般函數那樣調用

c=lambda x,y,z:x*y*z 
c(2,3,4)
  
24

 

當然,也可以在函數后面直接傳遞實參

 
1
2
( lambda x:x * * 2 )( 3 )
9
 

(2)將lambda函數作為參數傳遞給其他函數比如說結合map、filter、sorted、reduce等一些Python內置函數使用,下面舉例說明。

?
1
2
3
4
5
fliter( lambda x:x % 3 = = 0 ,[ 1 , 2 , 3 , 4 , 5 , 6 ])
[ 3 , 6 ]
squares = map ( lambda x:x * * 2 , range ( 5 )
print (lsit(squares))
[ 0 , 1 , 4 , 9 , 16 ]
 

與sorted函數結合使用,比如:創建由元組構成的列表:

a=[('b',3),('a',2),('d',4),('c',1)]

按照第一個元素排序

?
1
2
sorted (a,key = lambda x:x[ 0 ])
[( 'a' , 2 ),( 'b' , 3 ),( 'c' , 1 ),( 'd' , 4 )]
 

按照第二個元素排序

?
1
2
sorted (a,key = lambda x:x[ 1 ])
[( 'c' , 1 ),( 'a' , 2 ),( 'b' , 3 ),( 'd' , 4 )]
 

與reduce函數結合使用

?
1
2
3
from functools import reduce
print ( reduce ( lambda a,b: '{},{}' . format (a,b),[ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]))
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
 

(3)嵌套使用將lambda函數嵌套到普通函數中,lambda函數本身做為return的值

?
1
2
3
4
5
6
def increment(n):
   return lambda x:x + n
  
f = increment( 4 )
f( 2 )
6

 

(4)字符串聯合,有默認值,也可以用x=(lambda...)這種格式

?
1
2
3
4
x = ( lambda x = 'Boo' ,y = 'Too' ,z = 'Z00' :x + y + z)
print (x( 'Foo' ))
  
'FooTooZoo'
 

(5)在tkinter中定義內聯的callback函數

?
1
2
3
4
5
6
import sys
from tkinter import Button,mainloop
  
x = Button(text = 'Press me' ,command = ( lambda :sys.stdout.write( 'Hello,World\n' )))
x.pack()
x.mainloop()

 

這段代碼還是挺有意思的,希望小伙伴們可以復制粘貼運行一下哈。(6)判斷字符串是否以某個字母開頭有

?
1
2
3
4
Names = [ 'Anne' , 'Amy' , 'Bob' , 'David' , 'Carrie' , 'Barbara' , 'Zach' ]
B_Name = filter ( lambda x: x.startswith( 'B' ),Names)
print (B_Name)
[ 'Bob' , 'Barbara' ]

 

(7)求兩個列表元素的和

?
1
2
3
4
a = [ 1 , 2 , 3 , 4 ]
b = [ 5 , 6 , 7 , 8 ]
print ( list ( map ( lambda x,y:x + y, a,b)))
[ 6 , 8 , 10 , 12 ]
 

(8)求字符串每個單詞的長度

?
1
2
3
4
5
sentence = "Welcome To Beijing!"
words = sentence.split()
lengths = map ( lambda x: len (x),words)
print ( list (lengths))
[ 7 , 2 , 8 ]

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM