市建設(shè)局網(wǎng)站的綜合業(yè)務(wù)管理平臺(tái)網(wǎng)站seo入門基礎(chǔ)教程
Python 提供了非常多的庫和內(nèi)置函數(shù)。有不同的方法可以執(zhí)行相同的任務(wù),而在 Python 中,有個(gè)萬能之王函數(shù):lambda 函數(shù),它以不同的方式在任何地方使用。
一、Lambda 函數(shù)簡介
在 Python 中,函數(shù)可以接受一個(gè)或多個(gè)位置參數(shù)或關(guān)鍵字參數(shù)、可變參數(shù)列表、可變關(guān)鍵字參數(shù)列表等。它們可以傳遞給高階函數(shù)并作為輸出返回。常規(guī)函數(shù)可以有多個(gè)表達(dá)式和多個(gè)語句。
Python lambda 函數(shù)只是一個(gè)匿名函數(shù)。它也可以稱為無名函數(shù)。它直接接受參數(shù)的數(shù)量以及使用該參數(shù)執(zhí)行的條件或操作,該參數(shù)以冒號(hào)分隔,并返回最終結(jié)果。
普通的 Python 函數(shù)由def關(guān)鍵字定義。Python 中的 Lambda 函數(shù)通常由lambda關(guān)鍵字、任意數(shù)量的參數(shù)和一個(gè)表達(dá)式組成。
Lambda 函數(shù)主要用作單行函數(shù)。它們經(jīng)常在高階函數(shù)中使用,例如map()和filter()。這是因?yàn)槟涿瘮?shù)作為參數(shù)傳遞給高階函數(shù)。
lambda argument_list:expersion
argument_list是參數(shù)列表,它的結(jié)構(gòu)與Python中函數(shù)(function)的參數(shù)列表是一樣的
expression是一個(gè)關(guān)于參數(shù)的表達(dá)式,表達(dá)式中出現(xiàn)的參數(shù)需要在argument_list中有定義,并且表達(dá)式只能是單行的。
其中它可以接受任意數(shù)量的參數(shù),但是只允許包含一個(gè)表達(dá)式,而該表達(dá)式的運(yùn)算結(jié)果就是函數(shù)的返回值,我們可以簡單地來寫一個(gè)例子
(lambda x:x**2)(3)

二、為什么要使用Lambda函數(shù)?
一般情況下,我們不使用Lambda函數(shù),而是將其與高階函數(shù)一起使用。高階函數(shù)是一種需要多個(gè)函數(shù)來完成任務(wù)的函數(shù),或者當(dāng)一個(gè)函數(shù)返回任何另一個(gè)函數(shù)時(shí),可以選擇使用Lambda函數(shù)。
什么是高階函數(shù)
高階函數(shù)的概念在 Python 中很流行,就像在其他語言中一樣。它們是接受其他函數(shù)作為參數(shù)并返回函數(shù)作為輸出的函數(shù)。
在 Python 中,高階函數(shù)有兩個(gè)參數(shù):一個(gè)函數(shù)和一個(gè)可迭代對(duì)象。函數(shù)參數(shù)應(yīng)用于可迭代對(duì)象中的每個(gè)項(xiàng)目。由于我們可以將函數(shù)作為參數(shù)傳遞給高階函數(shù),因此我們同樣可以傳入 lambda 函數(shù)。
三、Python高階函數(shù)
在 Python 中,高階函數(shù)有兩個(gè)參數(shù):一個(gè)函數(shù)和一個(gè)可迭代對(duì)象。函數(shù)參數(shù)應(yīng)用于可迭代對(duì)象中的每個(gè)項(xiàng)目。由于我們可以將函數(shù)作為參數(shù)傳遞給高階函數(shù),因此我們同樣可以傳入 lambda 函數(shù)。
例如filter()、 map()和reduce()— 它是從 Python 中的 functools 模塊導(dǎo)入的,因?yàn)樗皇莾?nèi)置函數(shù)。默認(rèn)情況下,高階函數(shù)是接收其他函數(shù)作為參數(shù)的函數(shù)。
1、Map函數(shù)
map() 會(huì)根據(jù)提供的函數(shù)對(duì)指定序列做映射。
Map函數(shù)是一個(gè)接受兩個(gè)參數(shù)的函數(shù)。第一個(gè)參數(shù) function 以參數(shù)序列中的每一個(gè)元素調(diào)用 function 函數(shù),第二個(gè)是任何可迭代的序列數(shù)據(jù)類型。返回包含每次 function 函數(shù)返回值的新列表。
map(function, iterable, ...)
Map函數(shù)將定義在迭代器對(duì)象中的某種類型的操作。假設(shè)我們要將數(shù)組元素進(jìn)行平方運(yùn)算,即將一個(gè)數(shù)組的每個(gè)元素的平方映射到另一個(gè)產(chǎn)生所需結(jié)果的數(shù)組。
# coding=utf-8# 10以內(nèi)的平方
square_of_numbers = list(map(lambda x: x ** 2, range(10)))print(square_of_numbers)strings = ['Nigeria', 'Ghana', 'Niger', 'Kenya', 'Ethiopia', 'South Africa', 'Tanzania', 'Egypt', 'Morocco', 'Uganda']
# 獲取字符串長度
length_of_strings = list(map(lambda x: len(x), strings))print(length_of_strings)

以不同的方式使用Map函數(shù)。假設(shè)有一個(gè)包含名稱、地址等詳細(xì)信息的字典列表,目標(biāo)是生成一個(gè)包含所有名稱或者地址的新列表。
# coding=utf-8students = [{"name": "John Doe","father name": "Robert Doe","Address": "123 Hall street"},{"name": "Rahul Garg","father name": "Kamal Garg","Address": "3-Upper-Street corner"},{"name": "Angela Steven","father name": "Jabob steven","Address": "Unknown"}
]
print(list(map(lambda student: student['name'], students)))
print(list(map(lambda student: student['Address'], students)))

2、Filter函數(shù)
Filter函數(shù)根據(jù)給定的特定條件過濾掉數(shù)據(jù)。即在函數(shù)中設(shè)定過濾條件,迭代元素,保留返回值為True 的元素。Map 函數(shù)對(duì)每個(gè)元素進(jìn)行操作,而 filter 函數(shù)僅輸出滿足特定要求的元素。
filter(function or None, iterable) --> filter object
返回一個(gè)迭代器,為那些函數(shù)或項(xiàng)為真的可迭代項(xiàng)。如果函數(shù)為None,則返回為真的項(xiàng)。
假設(shè)有一個(gè)水果名稱列表,任務(wù)是只輸出那些名稱中包含字符“g”的名稱。
# coding=utf-8fruits = ['mango', 'apple', 'orange', 'cherry', 'grapes']
print(list(filter(lambda fruit: 'g' in fruit, fruits)))

假設(shè)有一個(gè)字符串列表,任務(wù)是只輸出那些字符串長度大于6的
# coding=utf-8strings = ['Nigeria', 'Ghana', 'Niger', 'Kenya', 'Ethiopia', 'South Africa', 'Tanzania', 'Egypt', 'Morocco', 'Uganda']# 字符串長度大于6的
length_of_strings_above_six = list(filter(lambda x: len(x) > 6, strings))print(length_of_strings_above_six)

3、Reduce函數(shù)
這個(gè)函數(shù)比較特別,不是 Python 的內(nèi)置函數(shù),需要通過from functools import reduce 導(dǎo)入。Reduce 從序列數(shù)據(jù)結(jié)構(gòu)返回單個(gè)輸出值,它通過應(yīng)用一個(gè)給定的函數(shù)來減少元素。
reduce(function, sequence[, initial]) -> value
將包含兩個(gè)參數(shù)的函數(shù)(function)累計(jì)應(yīng)用于序列(sequence)的項(xiàng),從左到右,從而將序列reduce至單個(gè)值。
如果存在initial,則將其放在項(xiàng)目之前的序列,并作為默認(rèn)值時(shí)序列是空的。
假設(shè)有一個(gè)整數(shù)列表,并求得所有元素相乘。且使用reduce函數(shù)而不是使用for循環(huán)來處理此問題。
# coding=utf-8from functools import reduce
nums = [2, 4, 6, 8, 10]
multiplication_of_nums = reduce(lambda x, y: x * y, nums)print(multiplication_of_nums)def mul_numbers(x, y):return x * yprint(reduce(mul_numbers, nums))
還可以使用 reduce 函數(shù)而不是for循環(huán)從列表中找到最大或最小的元素。
# coding=utf-8from functools import reduce
values = [13, 6, 12, 23, 15, 31, 16, 21]
min_value = reduce(lambda x, y: x if (x < y) else y, values)
max_value = reduce(lambda x, y: x if (x > y) else y, values)
print(min_value)
print(max_value)
四、高階函數(shù)的替代方法
1、列表推導(dǎo)式
其實(shí)列表推導(dǎo)式只是一個(gè)for循環(huán),用于添加新列表中的每一項(xiàng),以從現(xiàn)有索引或一組元素創(chuàng)建一個(gè)新列表。之前使用map、filter和reduce完成的工作也可以使用列表推導(dǎo)式完成。然而,相比于使用Map和filter函數(shù),很多人更喜歡使用列表推導(dǎo)式,也許是因?yàn)樗菀讘?yīng)用和記憶。
同樣使用列表推導(dǎo)式將數(shù)組中每個(gè)元素進(jìn)行平方運(yùn)算,水果的例子也可以使用列表推導(dǎo)式來解決。
arr = [2,4,6,8]
arr = [i**2 for i in arr]
print(arr)
fruit_result = [fruit for fruit in fruits if 'g' in fruit]
print(fruit_result)
2、字典推導(dǎo)式
與列表推導(dǎo)式一樣,使用字典推導(dǎo)式從現(xiàn)有的字典創(chuàng)建一個(gè)新字典。還可以從列表創(chuàng)建字典。
假設(shè)有一個(gè)整數(shù)列表,需要?jiǎng)?chuàng)建一個(gè)字典,其中鍵是列表中的每個(gè)元素,值是列表中的每個(gè)元素的平方。
# coding=utf-8nums = [2, 4, 6, 8, 10]
D1 = {item: item ** 2 for item in nums}
print(D1)
# 創(chuàng)建一個(gè)只包含奇數(shù)元素的字典
arr = [1, 2, 3, 4, 5, 6, 7, 8]
D2 = {item: item ** 2 for item in arr if item % 2 != 0}
print(D2)

五、簡單應(yīng)用:如何快速找到多個(gè)字典的公共鍵
方法一
dl = [d1, d2, d3] # d1, d2, d3為字典,目標(biāo)找到所有字典的公共鍵
[k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))]
dl = [{1:'life', 2: 'is'}, {1:'short', 3: 'i'}, {1: 'use', 4: 'python'}]
[k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))]
# 1
# 列表表達(dá)式遍歷dl中第一個(gè)字典中的鍵
[k for k in dl[0]]
# [1, 2]# lambda 匿名函數(shù)判斷字典中的鍵,即k值是否在其余字典中
list(map(lambda d: 1 in d, dl[1:]))
# [True, True]
list(map(lambda d: 2 in d, dl[1:]))
#[False, False]# 列表表達(dá)式條件為上述結(jié)果([True, True])全為True,則輸出對(duì)應(yīng)的k值
#1
方法二
# 利用集合(set)的交集操作
from functools import reduce
# reduce(lambda a, b: a*b, range(1,11)) # 10!
reduce(lambda a, b: a & b, map(dict.keys, dl))
六、寫在最后
目前已經(jīng)學(xué)習(xí)了Lambda函數(shù)是什么,以及Lambda函數(shù)的一些使用方法,以及如何在高階函數(shù)中使用lambda函數(shù)。
代碼的可讀性應(yīng)優(yōu)先于簡潔性。盡管 Python lambda 可以顯著減少編寫的代碼行數(shù),但應(yīng)謹(jǐn)慎使用,僅在必要時(shí)才使用。
Lambda 可以非常方便地使用 Python 三元表達(dá)式,但同樣不要犧牲可讀性。當(dāng)使用高階函數(shù)時(shí),Lambda 函數(shù)真正發(fā)揮作用。
總之:
Python lambda 非常適合編寫單行函數(shù)。
它們也用于 IIFE(立即調(diào)用的函數(shù)表達(dá)式)。
當(dāng)有多個(gè)表達(dá)式時(shí)不應(yīng)使用 Lambda,因?yàn)樗鼤?huì)使代碼不可讀。