我們大多數(shù)人都是作為一種面向?qū)ο蟮恼Z言介紹給Python的,但是Python函數(shù)對于數(shù)據(jù)科學(xué)家和程序員也是有用的工具。雖然類和對象很容易開始使用,但是還有其他方式可以編寫Python代碼。諸如Java之類的語言很難擺脫面向?qū)ο蟮乃伎?,但是Python使其變得容易。
鑒于Python促進(jìn)了不同的代碼編寫方法,一個邏輯上的后續(xù)問題是:什么是不同的代碼編寫方式?盡管對該問題有多個答案,但是最常見的替代代碼編寫方式稱為函數(shù)式編程。函數(shù)式編程的名稱源于編寫函數(shù),函數(shù)提供了程序中邏輯的主要來源。
在大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程中,我們將:
1)通過與面向?qū)ο缶幊踢M(jìn)行比較來解釋功能編程的基礎(chǔ)。
2)闡述為什么您可能希望將函數(shù)式編程合并到自己的代碼中。
3)向您展示Python如何允許您在兩者之間進(jìn)行切換。
比較面向?qū)ο蠛凸δ?br />
引入函數(shù)式編程的最簡單方法是將其與我們已經(jīng)意識到的東西進(jìn)行比較:面向?qū)ο蟮木幊?。假設(shè)我們要創(chuàng)建一個行計數(shù)器類,該類接收一個文件,讀取每一行,然后計算文件中的行總數(shù)。使用class,看起來可能類似于以下內(nèi)容:
雖然不是最佳實現(xiàn),但它確實提供了對面向?qū)ο笤O(shè)計的了解。在該類中,有一些熟悉的方法和屬性的概念。這些屬性設(shè)置并檢索對象的狀態(tài),然后這些方法操縱該狀態(tài)。
為了使這兩個概念同時起作用,對象的狀態(tài)必須隨時間變化。lines調(diào)用read()方法后,狀態(tài)的這種改變在屬性中顯而易見。例如,這是我們使用此類的方a:
一個對象的不斷變化的狀態(tài)既是它的祝福也是詛咒。為了理解為什么將變化的狀態(tài)視為負(fù)面狀態(tài),我們必須引入另一種選擇。另一種方法是將線路計數(shù)器構(gòu)建為一系列獨立的功能。
使用純函數(shù)
在前面的示例中,我們只能使用函數(shù)來計算行數(shù)。當(dāng)我們僅使用函數(shù)時,我們將一種函數(shù)式方法應(yīng)用于編程,這很自然地稱為函數(shù)式編程。函數(shù)式編程背后的概念要求函數(shù)是無狀態(tài)的,并且僅依賴于其給定的輸入來產(chǎn)生輸出。
滿足以上條件的函數(shù)稱為純函數(shù)。這是一個突出純函數(shù)與非純函數(shù)之間區(qū)別的示例:
使用純函數(shù)優(yōu)于不純函數(shù)(非純函數(shù))的好處是減少了副作用。如果在函數(shù)的操作范圍內(nèi)執(zhí)行了超出其范圍的更改,則會發(fā)生副作用。例如,當(dāng)我們更改對象的狀態(tài),執(zhí)行任何I / O操作甚至調(diào)用時,它們就會發(fā)生print():
程序員減少了代碼中的副作用,使其更易于跟蹤,測試和調(diào)試。代碼庫的副作用越多,遍歷程序并理解其執(zhí)行順序就越困難。
嘗試消除所有副作用是很方便的,但通常使用它們來簡化編程。如果我們要禁止所有副作用,那么您將無法讀取文件,調(diào)用print甚至無法在函數(shù)中分配變量。函數(shù)式編程的倡導(dǎo)者理解這種折衷,并在不犧牲開發(fā)實現(xiàn)時間的情況下,嘗試消除副作用。
Lambda表達(dá)
代替def函數(shù)聲明的語法,我們可以使用lambda表達(dá)式編寫Python函數(shù)。lambda語法緊隨其后def,但不是1對1映射。這是構(gòu)建一個將兩個整數(shù)相加的函數(shù)的示例:
該lambda表達(dá)式采用逗號分隔的輸入序列(例如def)。然后,緊接在冒號之后,它不使用顯式的return語句而返回表達(dá)式。最后,在將lambda表達(dá)式分配給變量時,它的行為完全類似于Python函數(shù),并且可以使用函數(shù)調(diào)用語法進(jìn)行調(diào)用new_add()。
如果我們未分配lambda變量名,則將其稱為匿名函數(shù)。這些匿名函數(shù)非常有用,尤其是在將它們用作另一個函數(shù)的輸入時。例如,該sorted() 函數(shù)接受一個可選key參數(shù)(一個函數(shù)),該參數(shù)描述應(yīng)如何對列表中的項目進(jìn)行排序。
地圖功能
盡管將函數(shù)作為參數(shù)傳遞的能力并不是Python獨有的,但這是編程語言的最新發(fā)展。允許這種行為的函數(shù)稱為一等函數(shù)。包含一流功能的任何語言都可以以功能樣式編寫。
功能范例中通常使用一組重要的一流功能。這些函數(shù)采用Python可迭代,并且sorted()對列表中的每個元素都應(yīng)用一個函數(shù)。在接下來的幾節(jié)中,我們將研究其中的每個功能,但它們都遵循的一般形式function_name(function_to_apply, iterable_of_elements)。
我們將使用的第一個功能是該map()功能。該map()函數(shù)接受一個可迭代的(即list),并創(chuàng)建一個新的可迭代對象,即一個特殊map對象。新對象將一流的功能應(yīng)用于每個元素。
這是我們可以使用map添加10或添加20到列表中每個元素的方法:
請注意,將返回值強(qiáng)制轉(zhuǎn)換map()為list對象很重要。map如果期望返回的對象像一樣運行,則很難使用它list。首先,打印它不會顯示每個項目,其次,您只能對其進(jìn)行一次迭代。
過濾功能
我們將使用的第二個功能是該filter()功能。該filter()函數(shù)接受一個I??terable,創(chuàng)建一個新的Iterable對象(再次是一個特殊map對象),以及一個必須返回bool值的一流函數(shù)。新map對象是返回的所有元素的過濾后迭代True。
這是我們?nèi)绾螐牧斜碇羞^濾奇數(shù)或偶數(shù)的方法:
約簡功能
我們要看的最后一個函數(shù)是包中的reduce()函數(shù)。該函數(shù)接受一個可迭代對象,然后將可迭代對象減小為單個值。Reduce與和有所不同,因為采用具有兩個輸入值的函數(shù)。functoolsreduce()filter()map()reduce()
這是一個示例,說明如何使用reduce()求和法對列表中的所有元素求和。
一個有趣的注意,使的是,你不必須在在第二個值操作lambda的表達(dá)。例如,您可以編寫一個始終返回可迭代對象的第一個值的函數(shù):
用列表理解進(jìn)行重寫
因為我們最終會轉(zhuǎn)換為列表,所以我們應(yīng)該改用list comprehension 重寫map()and filter()函數(shù)。這是編寫它們的更Python化的方式,因為我們利用Python語法來創(chuàng)建列表。您可以按照以下方式翻譯map()和filter()列出理解的示例:
從示例中,您可以看到我們不需要添加lambda表達(dá)式。如果您想在自己的代碼中添加map()或filter()函數(shù),通常是推薦的方法。但是,在下一節(jié)中,我們將提供一個案例,讓您仍然使用map()and filter()函數(shù)。
編寫功能部分
有時,我們想使用函數(shù)的行為,但要減少其使用的參數(shù)數(shù)量。目的是“保存”輸入之一,并創(chuàng)建一個新功能,該功能使用保存的輸入來默認(rèn)行為。假設(shè)我們想編寫一個函數(shù),該函數(shù)總是將2加到任何數(shù)字上:
該add_two函數(shù)類似于通用函數(shù)$ f(a,b)= a + b $,只是它默認(rèn)了一個參數(shù)($ a = 2 $)。在Python中,我們可以使用partial模塊從functools包中設(shè)置這些參數(shù)的默認(rèn)值。該partial模塊接收一個函數(shù),并從第一個參數(shù)開始“凍結(jié)”任意數(shù)量的args(或kwarg),然后返回具有默認(rèn)輸入的新函數(shù)。
部分函數(shù)可以接受任何函數(shù),包括標(biāo)準(zhǔn)庫中的函數(shù)。
下一步
在大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程中,我們介紹了函數(shù)式編程的范例。我們了解了Python中的lambda表達(dá)式,重要的功能函數(shù)以及局部函數(shù)的概念??傮w而言,我們表明Python為程序員提供了輕松在函數(shù)式編程和面向?qū)ο缶幊讨g進(jìn)行切換的工具。
查看其他資源,您可能會發(fā)現(xiàn)有幫助:
1)Python教程 —我們不斷擴(kuò)展的數(shù)據(jù)科學(xué)Python教程列表。
2)數(shù)據(jù)科學(xué)課程 -直接在瀏覽器中通過完全交互式的編程,數(shù)據(jù)科學(xué)和統(tǒng)計課程將您的學(xué)習(xí)提升到一個新的水平。
填寫下面表單即可預(yù)約申請免費試聽!怕錢不夠?可先就業(yè)掙錢后再付學(xué)費! 怕學(xué)不會?助教全程陪讀,隨時解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!
?2007-2022/ m.5wd995.cn 北京漫動者數(shù)字科技有限公司 備案號: 京ICP備12034770號 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc