旗下產(chǎn)業(yè): A產(chǎn)業(yè)/?A實(shí)習(xí)/?A計(jì)劃
全國(guó)統(tǒng)一咨詢熱線:010-5367 2995
首頁(yè) > 熱門(mén)文章 > 大數(shù)據(jù)分析 > 大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程

時(shí)間:2020-09-24來(lái)源:lb577.com點(diǎn)擊量:作者:Sissi
時(shí)間:2020-09-24點(diǎn)擊量:作者:Sissi




  我們大多數(shù)人都是作為一種面向?qū)ο蟮恼Z(yǔ)言介紹給Python的,但是Python函數(shù)對(duì)于數(shù)據(jù)科學(xué)家和程序員也是有用的工具。雖然類(lèi)和對(duì)象很容易開(kāi)始使用,但是還有其他方式可以編寫(xiě)Python代碼。諸如Java之類(lèi)的語(yǔ)言很難擺脫面向?qū)ο蟮乃伎?,但是Python使其變得容易。
 

  鑒于Python促進(jìn)了不同的代碼編寫(xiě)方法,一個(gè)邏輯上的后續(xù)問(wèn)題是:什么是不同的代碼編寫(xiě)方式?盡管對(duì)該問(wèn)題有多個(gè)答案,但是最常見(jiàn)的替代代碼編寫(xiě)方式稱為函數(shù)式編程。函數(shù)式編程的名稱源于編寫(xiě)函數(shù),函數(shù)提供了程序中邏輯的主要來(lái)源。
 

  在大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程中,我們將:
 

  1)通過(guò)與面向?qū)ο缶幊踢M(jìn)行比較來(lái)解釋功能編程的基礎(chǔ)。

  2)闡述為什么您可能希望將函數(shù)式編程合并到自己的代碼中。

  3)向您展示Python如何允許您在兩者之間進(jìn)行切換。
 

  比較面向?qū)ο蠛凸δ?br />  

  引入函數(shù)式編程的最簡(jiǎn)單方法是將其與我們已經(jīng)意識(shí)到的東西進(jìn)行比較:面向?qū)ο蟮木幊?。假設(shè)我們要?jiǎng)?chuàng)建一個(gè)行計(jì)數(shù)器類(lèi),該類(lèi)接收一個(gè)文件,讀取每一行,然后計(jì)算文件中的行總數(shù)。使用class,看起來(lái)可能類(lèi)似于以下內(nèi)容:
 

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  雖然不是最佳實(shí)現(xiàn),但它確實(shí)提供了對(duì)面向?qū)ο笤O(shè)計(jì)的了解。在該類(lèi)中,有一些熟悉的方法和屬性的概念。這些屬性設(shè)置并檢索對(duì)象的狀態(tài),然后這些方法操縱該狀態(tài)。
 

  為了使這兩個(gè)概念同時(shí)起作用,對(duì)象的狀態(tài)必須隨時(shí)間變化。lines調(diào)用read()方法后,狀態(tài)的這種改變?cè)趯傩灾酗@而易見(jiàn)。例如,這是我們使用此類(lèi)的方a:

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  一個(gè)對(duì)象的不斷變化的狀態(tài)既是它的祝福也是詛咒。為了理解為什么將變化的狀態(tài)視為負(fù)面狀態(tài),我們必須引入另一種選擇。另一種方法是將線路計(jì)數(shù)器構(gòu)建為一系列獨(dú)立的功能。

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  使用純函數(shù)
 

  在前面的示例中,我們只能使用函數(shù)來(lái)計(jì)算行數(shù)。當(dāng)我們僅使用函數(shù)時(shí),我們將一種函數(shù)式方法應(yīng)用于編程,這很自然地稱為函數(shù)式編程。函數(shù)式編程背后的概念要求函數(shù)是無(wú)狀態(tài)的,并且僅依賴于其給定的輸入來(lái)產(chǎn)生輸出。
 

  滿足以上條件的函數(shù)稱為純函數(shù)。這是一個(gè)突出純函數(shù)與非純函數(shù)之間區(qū)別的示例:
 

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  使用純函數(shù)優(yōu)于不純函數(shù)(非純函數(shù))的好處是減少了副作用。如果在函數(shù)的操作范圍內(nèi)執(zhí)行了超出其范圍的更改,則會(huì)發(fā)生副作用。例如,當(dāng)我們更改對(duì)象的狀態(tài),執(zhí)行任何I / O操作甚至調(diào)用時(shí),它們就會(huì)發(fā)生print():


大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  程序員減少了代碼中的副作用,使其更易于跟蹤,測(cè)試和調(diào)試。代碼庫(kù)的副作用越多,遍歷程序并理解其執(zhí)行順序就越困難。
 

  嘗試消除所有副作用是很方便的,但通常使用它們來(lái)簡(jiǎn)化編程。如果我們要禁止所有副作用,那么您將無(wú)法讀取文件,調(diào)用print甚至無(wú)法在函數(shù)中分配變量。函數(shù)式編程的倡導(dǎo)者理解這種折衷,并在不犧牲開(kāi)發(fā)實(shí)現(xiàn)時(shí)間的情況下,嘗試消除副作用。
 

  Lambda表達(dá)
 

  代替def函數(shù)聲明的語(yǔ)法,我們可以使用lambda表達(dá)式編寫(xiě)Python函數(shù)。lambda語(yǔ)法緊隨其后def,但不是1對(duì)1映射。這是構(gòu)建一個(gè)將兩個(gè)整數(shù)相加的函數(shù)的示例:

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  該lambda表達(dá)式采用逗號(hào)分隔的輸入序列(例如def)。然后,緊接在冒號(hào)之后,它不使用顯式的return語(yǔ)句而返回表達(dá)式。最后,在將lambda表達(dá)式分配給變量時(shí),它的行為完全類(lèi)似于Python函數(shù),并且可以使用函數(shù)調(diào)用語(yǔ)法進(jìn)行調(diào)用new_add()。
 

  如果我們未分配lambda變量名,則將其稱為匿名函數(shù)。這些匿名函數(shù)非常有用,尤其是在將它們用作另一個(gè)函數(shù)的輸入時(shí)。例如,該sorted() 函數(shù)接受一個(gè)可選key參數(shù)(一個(gè)函數(shù)),該參數(shù)描述應(yīng)如何對(duì)列表中的項(xiàng)目進(jìn)行排序。
 

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  地圖功能
 

  盡管將函數(shù)作為參數(shù)傳遞的能力并不是Python獨(dú)有的,但這是編程語(yǔ)言的最新發(fā)展。允許這種行為的函數(shù)稱為一等函數(shù)。包含一流功能的任何語(yǔ)言都可以以功能樣式編寫(xiě)。
 

  功能范例中通常使用一組重要的一流功能。這些函數(shù)采用Python可迭代,并且sorted()對(duì)列表中的每個(gè)元素都應(yīng)用一個(gè)函數(shù)。在接下來(lái)的幾節(jié)中,我們將研究其中的每個(gè)功能,但它們都遵循的一般形式function_name(function_to_apply, iterable_of_elements)。
 

  我們將使用的第一個(gè)功能是該map()功能。該map()函數(shù)接受一個(gè)可迭代的(即list),并創(chuàng)建一個(gè)新的可迭代對(duì)象,即一個(gè)特殊map對(duì)象。新對(duì)象將一流的功能應(yīng)用于每個(gè)元素。

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  這是我們可以使用map添加10或添加20到列表中每個(gè)元素的方法:

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  請(qǐng)注意,將返回值強(qiáng)制轉(zhuǎn)換map()為list對(duì)象很重要。map如果期望返回的對(duì)象像一樣運(yùn)行,則很難使用它list。首先,打印它不會(huì)顯示每個(gè)項(xiàng)目,其次,您只能對(duì)其進(jìn)行一次迭代。
 

  過(guò)濾功能
 

  我們將使用的第二個(gè)功能是該filter()功能。該filter()函數(shù)接受一個(gè)I??terable,創(chuàng)建一個(gè)新的Iterable對(duì)象(再次是一個(gè)特殊map對(duì)象),以及一個(gè)必須返回bool值的一流函數(shù)。新map對(duì)象是返回的所有元素的過(guò)濾后迭代True。

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  這是我們?nèi)绾螐牧斜碇羞^(guò)濾奇數(shù)或偶數(shù)的方法:

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  約簡(jiǎn)功能
 

  我們要看的最后一個(gè)函數(shù)是包中的reduce()函數(shù)。該函數(shù)接受一個(gè)可迭代對(duì)象,然后將可迭代對(duì)象減小為單個(gè)值。Reduce與和有所不同,因?yàn)椴捎镁哂袃蓚€(gè)輸入值的函數(shù)。functoolsreduce()filter()map()reduce()
 

  這是一個(gè)示例,說(shuō)明如何使用reduce()求和法對(duì)列表中的所有元素求和。

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  一個(gè)有趣的注意,使的是,你不必須在在第二個(gè)值操作lambda的表達(dá)。例如,您可以編寫(xiě)一個(gè)始終返回可迭代對(duì)象的第一個(gè)值的函數(shù):

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  用列表理解進(jìn)行重寫(xiě)
 

  因?yàn)槲覀冏罱K會(huì)轉(zhuǎn)換為列表,所以我們應(yīng)該改用list comprehension 重寫(xiě)map()and filter()函數(shù)。這是編寫(xiě)它們的更Python化的方式,因?yàn)槲覀兝肞ython語(yǔ)法來(lái)創(chuàng)建列表。您可以按照以下方式翻譯map()和filter()列出理解的示例:

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  從示例中,您可以看到我們不需要添加lambda表達(dá)式。如果您想在自己的代碼中添加map()或filter()函數(shù),通常是推薦的方法。但是,在下一節(jié)中,我們將提供一個(gè)案例,讓您仍然使用map()and filter()函數(shù)。
 

  編寫(xiě)功能部分
 

  有時(shí),我們想使用函數(shù)的行為,但要減少其使用的參數(shù)數(shù)量。目的是“保存”輸入之一,并創(chuàng)建一個(gè)新功能,該功能使用保存的輸入來(lái)默認(rèn)行為。假設(shè)我們想編寫(xiě)一個(gè)函數(shù),該函數(shù)總是將2加到任何數(shù)字上:

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  該add_two函數(shù)類(lèi)似于通用函數(shù)$ f(a,b)= a + b $,只是它默認(rèn)了一個(gè)參數(shù)($ a = 2 $)。在Python中,我們可以使用partial模塊從functools包中設(shè)置這些參數(shù)的默認(rèn)值。該partial模塊接收一個(gè)函數(shù),并從第一個(gè)參數(shù)開(kāi)始“凍結(jié)”任意數(shù)量的args(或kwarg),然后返回具有默認(rèn)輸入的新函數(shù)。

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  部分函數(shù)可以接受任何函數(shù),包括標(biāo)準(zhǔn)庫(kù)中的函數(shù)。

大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程
 

  下一步
 

  在大數(shù)據(jù)分析Python函數(shù)和函數(shù)式編程中,我們介紹了函數(shù)式編程的范例。我們了解了Python中的lambda表達(dá)式,重要的功能函數(shù)以及局部函數(shù)的概念??傮w而言,我們表明Python為程序員提供了輕松在函數(shù)式編程和面向?qū)ο缶幊讨g進(jìn)行切換的工具。
 

  查看其他資源,您可能會(huì)發(fā)現(xiàn)有幫助:
 

  1)Python教程 —我們不斷擴(kuò)展的數(shù)據(jù)科學(xué)Python教程列表。
 

  2)數(shù)據(jù)科學(xué)課程 -直接在瀏覽器中通過(guò)完全交互式的編程,數(shù)據(jù)科學(xué)和統(tǒng)計(jì)課程將您的學(xué)習(xí)提升到一個(gè)新的水平。


 

預(yù)約申請(qǐng)免費(fèi)試聽(tīng)課

填寫(xiě)下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽(tīng)!怕錢(qián)不夠?可先就業(yè)掙錢(qián)后再付學(xué)費(fèi)! 怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!

?2007-2021/北京漫動(dòng)者教育科技有限公司版權(quán)所有
備案號(hào):京ICP備12034770號(hào)

?2007-2022/ lb577.com 北京漫動(dòng)者數(shù)字科技有限公司 備案號(hào): 京ICP備12034770號(hào) 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc

京公網(wǎng)安備 11010802035704號(hào)

網(wǎng)站地圖