《從Python開(kāi)始學(xué)編程》第7章

第七章 函數(shù)式編程

7.1又見(jiàn)函數(shù)

1.Python中的函數(shù)式?

·作為第三種編程范式,函數(shù)式編程的本質(zhì)在于封裝

·在Python中,存在著可變更的對(duì)象,也能寫(xiě)出非純函數(shù)。由于純函數(shù)相互獨(dú)立,我們不用擔(dān)心函數(shù)調(diào)用對(duì)其他函數(shù)的影響。使用起來(lái)更加簡(jiǎn)單。

·當(dāng)多個(gè)進(jìn)程同時(shí)修改一個(gè)變量時(shí),進(jìn)程的先后順序會(huì)影響最終結(jié)果。


·如果兩個(gè)進(jìn)程并行地執(zhí)行兩個(gè)函數(shù),函數(shù)的執(zhí)行順序不確定,則可能結(jié)果為20,也有可能為30。這稱之為:競(jìng)跑條件(Race Condition),這是并行編程中需要極力避免的。

2.并行運(yùn)算

·指多條命令同時(shí)執(zhí)行。

·大規(guī)模并行運(yùn)算通常是在有多個(gè)主機(jī)組成的集群(Cluster)上進(jìn)行的。


上面有proc1()和proc2()兩個(gè)進(jìn)程,方法start()用于啟動(dòng)進(jìn)程,而join()方法用于在主程序中等待相應(yīng)進(jìn)程的完成。

·兩個(gè)并行的程序同時(shí)運(yùn)行,這就是進(jìn)程。計(jì)算機(jī)中,一個(gè)進(jìn)程不會(huì)占用另一個(gè)進(jìn)程的內(nèi)存空間,但一個(gè)進(jìn)程里面可以有多個(gè)線程,可以相互占用同一個(gè)進(jìn)程的內(nèi)存空間

7.2 被解放的函數(shù)

1.函數(shù)作為參數(shù)和返回值。

·函數(shù)可以像一個(gè)普通對(duì)象一樣,成為其他函數(shù)的參數(shù)

函數(shù)argument_demo()的第一個(gè)參數(shù)f就是一個(gè)函數(shù)對(duì)象,按照位置傳參,square_sum()傳遞給函數(shù)argument_demo(),對(duì)應(yīng)參數(shù)列表中的f

GUI回調(diào):


每當(dāng)按鈕被點(diǎn)擊時(shí),回調(diào)函數(shù)就會(huì)被調(diào)用

回調(diào)函數(shù)作為參數(shù)傳給按鈕的構(gòu)造器。

2.函數(shù)作為返回值

line_conf()的返回結(jié)果被賦予給line對(duì)象。

·函數(shù)對(duì)象的作用域與它的def的縮進(jìn)層級(jí)相同。


我們?cè)?b>line_conf()函數(shù)的隸屬范圍內(nèi)定義的函數(shù)line(),就只能在line_conf()的隸屬范圍內(nèi)調(diào)用。

3.閉包

·如果函數(shù)的定義中引用了外部變量

代碼中的b就是line()定義的隸屬程序塊中引用的高級(jí)層變量。b的定義不在line()內(nèi)部,而是一個(gè)外部對(duì)象。我們稱其為line()的環(huán)境變量

一個(gè)函數(shù)和它的環(huán)境變量合在一起,就構(gòu)成了一個(gè)閉包(Closure)。閉包中包含的是內(nèi)部函數(shù)返回時(shí)的外部對(duì)象的值。

·閉包可以提高代碼復(fù)用性


·閉包能起到減少函數(shù)參數(shù)的作用:


7.3 小女子的梳妝匣

1.裝飾器

·裝飾器可以對(duì)一個(gè)函數(shù)、方法或者類進(jìn)行加工。

基礎(chǔ)


手動(dòng)輸入

·我們可以改用裝飾器,定義功能拓展本身,再把裝飾器用于兩個(gè)函數(shù):


實(shí)際上發(fā)生:square_sum=decorator_demo(square_sum)? ? ? ?square_sum(3,4)


·把測(cè)量程序運(yùn)行時(shí)間的功能做成一個(gè)裝飾器,把這個(gè)裝飾器運(yùn)用于其他函數(shù),將顯示函數(shù)的實(shí)際運(yùn)行時(shí)間


·裝飾器可以實(shí)現(xiàn)代碼的可復(fù)用性。我們可以用同一個(gè)裝飾器修飾多個(gè)函數(shù),以便實(shí)現(xiàn)相同的附加功能

2.帶參裝飾器

·裝飾器還可以自帶參數(shù),為裝飾器的編寫(xiě)和使用提供了更大的靈活性。

2.帶參裝飾器


7.4 高階函數(shù)

1.Iambda與map

·能夠接收其他函數(shù)作為參數(shù)的函數(shù),被稱之為高階函數(shù)(high-order function)。

lambda語(yǔ)法:用來(lái)定義簡(jiǎn)短的匿名函數(shù)

定義函數(shù)x+y

map()函數(shù):

函數(shù)map()的第二個(gè)參數(shù)是一個(gè)可循環(huán)對(duì)象。對(duì)于data_list的每個(gè)元素,lambda函數(shù)都會(huì)調(diào)用一次。

等價(jià)于

filter函數(shù)

reduce函數(shù)

4.并行處理

7.5 自上而下

1.便捷表達(dá)式

2.求懶惰值

迭代器和列表 效果上一樣

·懶惰求值可以最小化計(jì)算機(jī)要做的工作。


懶惰求值


即時(shí)求值

3.itertools包

count(初始值, 步長(zhǎng)) :從初始值開(kāi)始,每次增加步長(zhǎng)單位。 count(5,2) 5,7,9,11

cycle("序列"):重復(fù)序列中的各元素。abcabcabc

repeat(對(duì)象,次數(shù))? ? :重復(fù)對(duì)象多次。 1.2 1.2 1.2 1.2

chain(迭代器,迭代器)? ? :連接兩個(gè)迭代器成為一個(gè)。 【1,2,3】,【4,5,6】? 1,2,3,4,5,6

product(迭代器, 迭代器)? ? ? ? :多個(gè)迭代器集合的笛卡兒積(集合元素所有可能的組合方式),相當(dāng)于嵌套循環(huán)

starmap(函數(shù),對(duì)象) :將函數(shù)應(yīng)用于對(duì)象中的每一個(gè)元素 。

permutations("abc", 2) :從序列中隨機(jī)挑出2個(gè)元素進(jìn)行排序,并將結(jié)果返回新的迭代器(區(qū)分順序)。

combinations("abc", 2):從序列中隨機(jī)挑出2個(gè)元素進(jìn)行組合,并將結(jié)果返回新的迭代器(不區(qū)分順序)。

combinations_with_replacement("abc", 2) :從序列中隨機(jī)挑出2個(gè)元素進(jìn)行組合,允許兩次挑出的元素重復(fù),并將結(jié)果返回新的迭代器(不區(qū)分順序)。

takewhile(lambda x: x < 5, [1, 3, 6, 7, 1]) :當(dāng)函數(shù)返回True時(shí),收集元素到迭代器。一旦函數(shù)返回False,則停止。結(jié)果為1, 3 。

dropwhile(lambda x: x < 5, [1, 3, 6, 7, 1]) :當(dāng)函數(shù)返回False時(shí),跳過(guò)元素。一旦函數(shù)返回True,則開(kāi)始收集剩下的所有元素到迭代器。結(jié)果為6, 7, 1。

groupby(friends, key = height_class): 將一個(gè)key()函數(shù)作用于原迭代器的各個(gè)元素獲得各個(gè)函數(shù)的鍵值。根據(jù)key()函數(shù)結(jié)果,將擁有元素分組。每個(gè)分組中的元素都保留了鍵值形成的返回結(jié)果。函數(shù)groupby()分出的組放在一個(gè)迭代器中返回。

compress("ABCD", [1, 1, 1, 0])? ? :根據(jù)[1, 1, 1, 0]的真假值情況,選擇保留第一個(gè)參數(shù)中的元素。結(jié)果為A, B, C。

islice(開(kāi)始值,結(jié)束值,步長(zhǎng)) :切片函數(shù),從開(kāi)始值到結(jié)束值,每隔步長(zhǎng)單位進(jìn)行切片,并將結(jié)果返回迭代器。

izip(迭代器……):將各個(gè)迭代器中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,并且構(gòu)成新的迭代器返回。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容