鍍金池/ 教程/ Python/ 匿名函數(shù)
基礎(chǔ)
itertools
HTTP 服務(wù)
hashlib
閉包
文件和目錄
單元測(cè)試
使用 @property
標(biāo)準(zhǔn)模塊
陌生的 metaclass
Base64
進(jìn)程、線程和協(xié)程
讀寫二進(jìn)制文件
匿名函數(shù)
輸入和輸出
Click
元組
字符編碼
partial 函數(shù)
參考資料
collections
協(xié)程
類和實(shí)例
Python 之旅
定制類和魔法方法
常用數(shù)據(jù)類型
繼承和多態(tài)
ThreadLocal
HTTP 協(xié)議簡(jiǎn)介
Requests 庫的使用
讀寫文本文件
列表
os 模塊
迭代器 (Iterator)
正則表達(dá)式
集合
上下文管理器
異常處理
你不知道的 super
定義函數(shù)
datetime
資源推薦
字典
slots 魔法
hmac
第三方模塊
進(jìn)程
類方法和靜態(tài)方法
函數(shù)參數(shù)
高階函數(shù)
函數(shù)
re 模塊
高級(jí)特性
線程
argparse
生成器
結(jié)束語
字符串
map/reduce/filter
函數(shù)式編程
Celery
裝飾器

匿名函數(shù)

在 Python 中,我們使用 def 語句來定義函數(shù),比如:

def double(x):
    return 2 * x

除了用上面的方式定義函數(shù),Python 還提供了一個(gè)關(guān)鍵字 lambda,讓我們可以創(chuàng)建一個(gè)匿名函數(shù),也就是沒有名稱的函數(shù)。它的形式如下:

lambda 參數(shù): 表達(dá)式

關(guān)鍵字 lambda 說明它是一個(gè)匿名函數(shù),冒號(hào) : 前面的變量是該匿名函數(shù)的參數(shù),冒號(hào)后面是函數(shù)的返回值,注意這里不需使用 return 關(guān)鍵字。

我們將上面的 double 函數(shù)改寫成一個(gè)匿名函數(shù),如下:

lambda x: 2 * x

那怎么調(diào)用匿名函數(shù)呢?可以直接這樣使用:

>>> (lambda x: 2 * x)(8)
16

由于匿名函數(shù)本質(zhì)上是一個(gè)函數(shù)對(duì)象,也可以將其賦值給另一個(gè)變量,再由該變量來調(diào)用函數(shù),如下:

>>> f = lambda x: 2 * x   # 將匿名函數(shù)賦給變量 f  
>>> f
<function <lambda> at 0x7f835a696578>
>>> f(8)
16

使用場(chǎng)景

lambda 函數(shù)一般適用于創(chuàng)建一些臨時(shí)性的,小巧的函數(shù)。比如上面的 double 函數(shù),我們當(dāng)然可以使用 def 來定義,但使用 lambda 來創(chuàng)建會(huì)顯得很簡(jiǎn)潔,尤其是在高階函數(shù)的使用中。

看一個(gè)例子:

def func(g, arr):
    return [g(x) for x in arr]

現(xiàn)在給一個(gè)列表 [1, 2, 3, 4],利用上面的函數(shù),對(duì)列表中的元素加 1,返回一個(gè)新的列表,你可能這樣用:

def add_one(x):
    return x + 1

arr = func(add_one, [1, 2, 3, 4])

這樣做沒什么錯(cuò),可是 add_one 這個(gè)函數(shù)太簡(jiǎn)單了,使用 def 定義未免有點(diǎn)小題大作,我們改用 lambda

arr = func(lambda x: x + 1, [1, 2, 3, 4])

是不是很簡(jiǎn)潔、易懂?

小結(jié)

  • 匿名函數(shù)本質(zhì)上是一個(gè)函數(shù),沒有函數(shù)名稱,因此使用匿名函數(shù)不用擔(dān)心函數(shù)名沖突;
  • 匿名函數(shù)一般適用于創(chuàng)建一些臨時(shí)性的,小巧的函數(shù);
上一篇:文件和目錄下一篇:字典