成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python中Lambda的前4個錯誤

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

 

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

[[320252]]

當然,lambda具有使我們的代碼簡潔的優(yōu)勢,但是在項目中過度使用它們會導(dǎo)致濫用,從而降低我們代碼的可讀性和可維護性。

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

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

 

  1. lambda arguments: expression 

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

 

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

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

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

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

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

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

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

 

  1. >>> pets = ['dog''turtle''bird''fish''kitty'
  2. >>> sorted(pets, key=lambda x: len(x)) 
  3. ['dog''bird''fish''kitty''turtle'
  4. # The built-in len() function 
  5. >>> sorted(pets, key=len) 
  6. ['dog''bird''fish''kitty''turtle'

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

 

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

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

2.將其分配給變量

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

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

 

  1. >>> divide_two_numbers = lambda x, y: x / y 
  2. >>> divide_two_numbers(4, 5) 
  3. 0.8 

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

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

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

 

  1. >>> def divide_two_numbers_fun(x,y):  
  2. ...     return x / y 
  3. ...  
  4. >>> divide_two_numbers_fun(7, 8) 
  5. 0.875 

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

讓我們看一個簡單的例子,可能發(fā)生的事情。 在實際情況下,事情可能會變得復(fù)雜得多。

 

  1. >>> divide_two_numbers(3, 0) 
  2. Traceback (most recent call last): 
  3.   File "<stdin>", line 1, in <module> 
  4.   File "<stdin>", line 1, in <lambda> 
  5. ZeroDivisionError: division by zero 
  6. >>> divide_two_numbers_fun(3, 0) 
  7. Traceback (most recent call last): 
  8.   File "<stdin>", line 1, in <module> 
  9.   File "<stdin>", line 1, in divide_two_numbers_fun 
  10. ZeroDivisionError: division by zero 

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

為什么沒有顯示功能名稱?

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

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

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

當我們說高階函數(shù)時,是指可以通過將函數(shù)作為參數(shù)或通過返回函數(shù)來對其他函數(shù)進行操作的函數(shù)。

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

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

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

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

 

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

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

當然,掌握列表理解能力是另一個" Pythonic功能"主題,需要另一個教程。

 

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

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

4.表達式太笨拙

這比以前的方法少見。 但是一些程序員只是盡可能地使用lambda來努力編寫最多的Python代碼。 有時需要付出一定的代價-可讀性。

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

 

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

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

 

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

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

 優(yōu)秀實踐4:如果lambda的表達式過于繁瑣,則編寫一個正則函數(shù)。

總結(jié)

Lambda一直是Python初學(xué)者的硬主題之一,他們一開始就不惜一切代價避免使用它們。

一段時間后,當恐懼消失時,他們開始學(xué)習(xí)lambda,并發(fā)現(xiàn)自己一點也不難。 然后,它們開始使用lambda,但不幸的是,有些人可能過多地使用了lambda,導(dǎo)致如上所述的各種濫用。

我希望本文可以幫助解決其中一些問題。

通過避免這些誤用并遵循優(yōu)秀實踐技巧,我敢打賭,正確使用lambda的Python代碼將具有更好的可讀性和可維護性。

責任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2025-01-15 07:00:00

Java代碼Lambda

2022-06-27 08:36:08

PythonLambda

2021-09-13 07:53:31

Go錯誤處理

2020-05-06 15:15:33

Python開發(fā)工具

2024-09-23 16:49:32

2020-03-20 15:10:09

Python錯誤分析代碼

2020-09-17 11:08:53

GitHubPython倉庫

2024-05-30 14:21:00

lambdaPython代碼

2010-03-17 13:46:55

Python sock

2024-04-28 11:36:07

LambdaPython函數(shù)

2013-01-20 14:54:34

PythonLambda

2024-06-24 10:00:00

Python編程

2024-10-07 08:26:05

編程Python異常處理

2009-06-22 10:34:43

Boost庫lambda

2025-02-10 00:00:00

技巧JavaStreams

2020-08-16 12:38:32

Python算法編程

2024-01-31 13:50:00

系統(tǒng)設(shè)計系統(tǒng)

2009-01-16 22:19:58

服務(wù)器虛擬化

2010-07-19 12:54:16

SQL Server安

2020-11-06 08:30:45

數(shù)據(jù)分析數(shù)據(jù)思維錯誤
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲欧美日韩成人在线 | 在线激情视频 | 国产精品射 | 91视频久久| 日韩中文在线视频 | 在线看av的网址 | 日韩伦理一区二区三区 | 精品免费国产一区二区三区 | 欧美爱爱视频 | 亚洲精色| 国产在线一区二 | 91精品国产91久久久久游泳池 | 日韩精品免费一区二区在线观看 | 午夜天堂精品久久久久 | 91偷拍精品一区二区三区 | 精品一区国产 | 成人久久18免费网站麻豆 | 免费视频一区二区 | 亚洲成人国产精品 | 99精品国产一区二区三区 | 99福利视频| 成人黄色a| 国产精品久久国产精品 | 亚洲乱码一区二区三区在线观看 | 天天干天天爱天天操 | 亚洲国产精品一区二区三区 | 欧美日韩高清在线一区 | 亚洲欧洲精品一区 | 免费国产视频 | 色橹橹欧美在线观看视频高清 | 成人在线影视 | 99精品国产一区二区青青牛奶 | 91亚洲国产成人久久精品网站 | 六月成人网 | 天天操天天拍 | 久久福利电影 | www久久久| 国产精品成人一区二区三区夜夜夜 | 久草在线 | 色姑娘av| 最新午夜综合福利视频 |