Python之匿名函式
阿新 • • 發佈:2022-05-03
Python之匿名函式 今天給大家介紹一下Python中的匿名函式。
匿名函式
- 由
lambda
關鍵字來定義 - 引數列表不需要小括號
- 冒號不是開啟新的語句塊的
- 只能寫在一行上
- 沒有return語句,最後一個表示式的值就是返回值
一個簡單的例子:
In[1]: lambda x: x+1 Out[1]: <function __main__.<lambda>> # 第一種用法 (lambda x: x + 1)(3) # 第一個括號用來改變優先順序,第二對括號表示函式呼叫 In[2]: (lambda x: x+1)(3) Out[2]: 4 # 第二種用法,把匿名函式賦值給變數 f = lambda x: x + 1 f(5) In[3]: f = lambda x: x+1 In[4]: f(5) Out[4]: 6 lambda x, y: x + y # 也可以這樣呼叫 (lambda x, y: x + y)(3, 5) # 第一個括號是用來改變優先順序的,第二個括號是呼叫函式的 add = lambda x, y: x + y add(3, 5)
也可以設定預設引數:
lambda x, y=1: x + y
add = lambda x, y=1: x + y
add(3)
# 呼叫的時候也可以用關鍵字引數
add(x=5)
lambda x, y=1: x + y
<function <lambda> at 0x1019e10d0>
add = lambda x, y=1: x + y
add(3)
4
# 呼叫的時候也可以用關鍵字引數
add(x=5)
6
可變引數可以嗎?
In[5]: f = lambda *x: x In[6]: f(1, 2, 3) Out[6]: (1, 2, 3) In[7]: lst = [1, 2, 3] In[8]: f(*lst) Out[8]: (1, 2, 3)
關鍵字引數可以嗎?
In[9]: f = lambda **kw: kw
In[10]: f(a=0)
Out[10]: {'a': 0}
In[11]: dict01 = {'name': 'lavenliu.cn', 'age': 23}
In[12]: f(**dict01)
Out[12]: {'age': 23, 'name': 'lavenliu.cn'}
可變引數與可變關鍵字引數同時使用呢?
In[13]: (lambda *args, **kwargs: print(args, kwargs))(*range(3), **{str(x): x for x in range(3)}) (0, 1, 2) {'0': 0, '1': 1, '2': 2} In[14]: (lambda *args, **kwargs: print(args, kwargs))(*range(3), **{str(x): x for x in range(3)}) (0, 1, 2) {'0': 0, '1': 1, '2': 2}
引數槽可以嗎?
In[15]: f = lambda x, *, y: x+y
In[16]: f(1, y=3)
Out[16]: 4
普通函式所支援的引數變化,匿名函式都支援。
再來一例:
In[17]: concat = lambda *args: ''.join(args)
In[18]: concat('a', 'b', 'c')
Out[18]: 'abc'
In[19]: lower = (lambda x, y: x if x < y else y)
In[20]: lower(7, 3)
Out[20]: 3
In[21]: lower('a', 'b')
Out[21]: 'a'
In[22]: lower(2.3, 4.5)
Out[22]: 2.3
匿名函式通常和高階函式配合使用,作為引數傳入,或者作為返回值返回。
匿名函式最好不要定義成遞迴函式。
In[29]: fib = lambda n: 1 if n == 0 or n == 1 else fib(n-1) + fib(n-2)
In[30]: fib(5)
Out[30]: 8
一個例子:
from collections import namedtuple
User = namedtuple('User', ['name', 'age'])
users = [User('lavenliu', 23), User('taoqi', 20)]
def get_age(user):
return user.age
sorted(users, key=get_age)
[User(name='taoqi', age=20), User(name='lavenliu', age=23)]
# 或者使用匿名函式
sorted(users, key=lambda x: x.age)
[User(name='taoqi', age=20), User(name='lavenliu', age=23)]
list(map(lambda x: x.age, users))
list(filter(lambda x: x.age < 30, users))
自己實現一個map函式,
In[31]: def map_(fn, it):
...: return [fn(x) for x in it]
...:
In[32]: def square(n):
...: return n ** 2
...:
In[33]: lst1 = [1, 2, 3, 4, 5]
# 使用自定義的map函式
In[34]: map_(square, lst1)
Out[34]: [1, 4, 9, 16, 25]
自己實現一個filter函式,
def filter_(fn, it):
return [x for x in it if fn(x)]
今天的內容就到這裡,歡迎大家繼續關注小白的技術客棧。