溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中使用Lambda要注意什么

發(fā)布時(shí)間:2021-11-03 10:28:58 來(lái)源:億速云 閱讀:115 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了Python中使用Lambda要注意什么,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

lambda被認(rèn)為是非常Python的語(yǔ)言,是Python編程中比較受歡迎的功能之一。 如此之多,以至于許多Python程序員都想盡可能地使用它們。

Python中使用Lambda要注意什么

當(dāng)然,lambda具有使我們的代碼簡(jiǎn)潔的優(yōu)勢(shì),但是在項(xiàng)目中過(guò)度使用它們會(huì)導(dǎo)致濫用,從而降低我們代碼的可讀性和可維護(hù)性。

在開(kāi)始研究這些誤用是什么之前,讓我們先快速回顧一下lambda。 如果您對(duì)它們非常了解,則可以跳到下一部分。

Lambda,也稱為lambda函數(shù),是匿名函數(shù),可以接受任意數(shù)量的參數(shù),而只有一個(gè)表達(dá)式。 它們的聲明由lambda關(guān)鍵字表示。 基本語(yǔ)法如下。

lambda arguments: expression

Lambda最適合需要小的功能且僅使用一次的地方。 lambda的一種常見(jiàn)用法是將其設(shè)置為內(nèi)置sorted()函數(shù)中的關(guān)鍵參數(shù)。 這是一個(gè)例子。

>>> students = [('Mike', 'M', 15), ('Mary', 'F', 14), ('David', 'M', 16)] 
>>> sorted(students, key=lambda x: x[2]) 
[('Mary', 'F', 14), ('Mike', 'M', 15), ('David', 'M', 16)] 
# The students are sorted by age

許多教程在解釋lambda是什么以及可以在哪里使用lambda方面做得很好,因此,沒(méi)有充分的理由在這里重復(fù)大量的講解。

相反,本文的目的是向您展示最常見(jiàn)的lambda誤用,以便在以下所列情況以外的其他情況下使用lambda時(shí),您可能會(huì)正確使用它們。

1.重新發(fā)明輪子

lambdas的第一個(gè)誤用是忽略了現(xiàn)有的內(nèi)置函數(shù)。

讓我們?nèi)匀灰詓orted()函數(shù)為例。 假設(shè)我們有一個(gè)字符串列表,我們想使用它們的長(zhǎng)度對(duì)它們進(jìn)行排序。

當(dāng)然,lambda函數(shù)lambda x:len(x)可以工作,但是直接使用內(nèi)置的len()函數(shù)怎么樣?

>>> pets = ['dog', 'turtle', 'bird', 'fish', 'kitty'] 
>>> sorted(pets, key=lambda x: len(x)) 
['dog', 'bird', 'fish', 'kitty', 'turtle'] 
# The built-in len() function 
>>> sorted(pets, key=len) 
['dog', 'bird', 'fish', 'kitty', 'turtle']

這是另一個(gè)涉及使用max()函數(shù)的示例。

>>> number_tuples = [(4, 5, 7), (3, 1, 2), (9, 4, 1)] 
>>> sorted(number_tuples, key=lambda x: max(x)) 
[(3, 1, 2), (4, 5, 7), (9, 4, 1)] 
# The built-in max() function 
>>> sorted(number_tuples, key=max) 
[(3, 1, 2), (4, 5, 7), (9, 4, 1)]

優(yōu)秀實(shí)踐1:在編寫(xiě)自己的Lambda之前先考慮一下內(nèi)置函數(shù)。

2.將其分配給變量

在一些教程(包括我的一些教程)中,我已經(jīng)看到了將lambdas分配給變量的方法,但是它主要是向初學(xué)者展示lambdas本質(zhì)上是函數(shù)。

但是,某些初學(xué)者可能已將其作為一種好習(xí)慣,并認(rèn)為lambda只是聲明短函數(shù)的便捷方式。 以下代碼片段向您展示了這種濫用。

>>> divide_two_numbers = lambda x, y: x / y 
>>> divide_two_numbers(4, 5) 
0.8

為什么要避免這種情況? 如果您還記得上面提到的內(nèi)容,那么lambda應(yīng)該只使用一次,因此沒(méi)有理由將lambda分配給變量。

如果確實(shí)需要使用相關(guān)功能,則應(yīng)使用def關(guān)鍵字來(lái)聲明一個(gè)常規(guī)函數(shù),如下所示。

如果您認(rèn)為使用此簡(jiǎn)單功能的兩行代碼并不酷,我們可以將其重寫(xiě)為一行:defdivid_two_numbers_fun(x,y):返回x / y,其工作方式相同。

>>> def divide_two_numbers_fun(x,y):  
...     return x / y 
...  
>>> divide_two_numbers_fun(7, 8) 
0.875

避免為變量分配lambda的主要原因是出于調(diào)試/維護(hù)的目的,尤其是在生產(chǎn)/團(tuán)隊(duì)合作環(huán)境中。

讓我們看一個(gè)簡(jiǎn)單的例子,可能發(fā)生的事情。 在實(shí)際情況下,事情可能會(huì)變得復(fù)雜得多。

>>> divide_two_numbers(3, 0) 
Traceback (most recent call last): 
  File "", line 1, in  
  File "", line 1, in  
ZeroDivisionError: division by zero 
>>> divide_two_numbers_fun(3, 0) 
Traceback (most recent call last): 
  File "", line 1, in  
  File "", line 1, in divide_two_numbers_fun 
ZeroDivisionError: division by zero

如您在上面看到的,通過(guò)常規(guī)函數(shù)的聲明,我們確切地知道哪個(gè)函數(shù)導(dǎo)致了錯(cuò)誤。 相比之下,使用lambda只能告訴我們存在一個(gè)lambda導(dǎo)致錯(cuò)誤。

為什么沒(méi)有顯示功能名稱?

這是因?yàn)閘ambda是匿名函數(shù),所有這些函數(shù)都具有相同的名稱-。 您能想象如果您的同事發(fā)現(xiàn)數(shù)十個(gè)存在錯(cuò)誤會(huì)多么令人沮喪?

優(yōu)秀實(shí)踐2:要多次使用常規(guī)函數(shù)而不是lambda。

3.高階函數(shù)使用不當(dāng)

當(dāng)我們說(shuō)高階函數(shù)時(shí),是指可以通過(guò)將函數(shù)作為參數(shù)或通過(guò)返回函數(shù)來(lái)對(duì)其他函數(shù)進(jìn)行操作的函數(shù)。

與當(dāng)前主題相關(guān)的函數(shù)是map(),filter()和reduce(),它們?cè)趌ambda的許多教程中都已或多或少地被使用。 但是,這導(dǎo)致對(duì)lambda以及更高階函數(shù)的某種濫用。

出于演示目的,我將在本教程中僅使用map()函數(shù),但相同的原理也適用于其他高階函數(shù)。

假設(shè)我們有一個(gè)整數(shù)列表,并且希望有一個(gè)包含它們的平方的列表。 下面將lambda與map()函數(shù)一起使用。

我們將獲得一個(gè)迭代器-map()函數(shù)中的map對(duì)象,然后將其轉(zhuǎn)換為列表,我們需要在此迭代器上調(diào)用list()函數(shù)。

>>> numbers = [1, 2, 3, 5, 8] 
>>> squares = list(map(lambda x: x * x, numbers)) 
>>> squares 
[1, 4, 9, 25, 64]

實(shí)際上,可以通過(guò)列表理解方便地實(shí)現(xiàn)相同的功能-不需要高階函數(shù)或lambda。 更加簡(jiǎn)潔易讀,不是嗎?

當(dāng)然,掌握列表理解能力是另一個(gè)" Pythonic功能"主題,需要另一個(gè)教程。

>>> numbers = [1, 2, 3, 5, 8] 
>>> squares = [x * x for x in numbers] 
>>> squares 
[1, 4, 9, 25, 64]

優(yōu)秀實(shí)踐3:考慮使用帶列表推導(dǎo)的lambda替換高階函數(shù)。

4.表達(dá)式太笨拙

這比以前的方法少見(jiàn)。 但是一些程序員只是盡可能地使用lambda來(lái)努力編寫(xiě)最多的Python代碼。 有時(shí)需要付出一定的代價(jià)-可讀性。

假設(shè)我們有一個(gè)字符串列表,我們需要使用一個(gè)奇怪的要求對(duì)它們進(jìn)行排序:?jiǎn)卧~中不同元音的數(shù)量。 在sorted()函數(shù)中使用lambda如下所示。

>>> texts = ['iiiii', 'bag', 'beto', 'blackboard', 'sequoia'] 
>>> sorted(texts, key=lambda x: len(set([l for l in list(x) if l in ['a','e','i','o','u']]))) 
['iiiii', 'bag', 'beto', 'blackboard', 'sequoia']

它可以按預(yù)期工作,但絕對(duì)不是最易讀的代碼。 下面的代碼怎么樣?

>>> texts = ['iiiii', 'bag', 'beto', 'blackboard', 'sequoia'] 
>>> def number_distinct_vowels(x): 
...     vowels = ['a', 'e', 'i', 'o', 'u'] 
...     vowels_only = [l for l in list(x) if l in vowels] 
...     distinct_vowels = set(all_vowels) 
...     return len(distinct_vowels) 
...  
>>> sorted(texts, key=number_distinct_vowels) 
['iiiii', 'bag', 'beto', 'blackboard', 'sequoia']

當(dāng)然,我們需要再寫(xiě)幾行代碼,但是新代碼難道不具有更好的可讀性嗎?

優(yōu)秀實(shí)踐4:如果lambda的表達(dá)式過(guò)于繁瑣,則編寫(xiě)一個(gè)正則函數(shù)。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Python中使用Lambda要注意什么”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI