1. 程式人生 > >Python之匿名函數

Python之匿名函數

python 函數 匿名函數

今天給大家介紹一下Python中的匿名函數。

匿名函數

  1. lambda關鍵字來定義
  2. 參數列表不需要小括號
  3. 冒號不是開啟新的語句塊的
  4. 只能寫在一行上
  5. 沒有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)]

今天的內容就到這裏,歡迎大家繼續關註微信公眾號:小白的技術客棧。

Python之匿名函數