總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則
在任何編程語(yǔ)言中,函數(shù)的應(yīng)用主要出于以下兩種情況:
1.代碼塊重復(fù),這時(shí)候必須考慮用到函數(shù),降低程序的冗余度
2.代碼塊復(fù)雜,這時(shí)候可以考慮用到函數(shù),增強(qiáng)程序的可讀性
當(dāng)流程足夠繁雜時(shí),就要考慮函數(shù),及如何將函數(shù)組合在一起。在Python中做函數(shù)設(shè)計(jì),主要考慮到函數(shù)大小、聚合性、耦合性三個(gè)方面,這三者應(yīng)該歸結(jié)于規(guī)劃與設(shè)計(jì)的范疇。高內(nèi)聚、低耦合則是任何語(yǔ)言函數(shù)設(shè)計(jì)的總體原則。
1.如何將任務(wù)分解成更有針對(duì)性的函數(shù)從而導(dǎo)致了聚合性
2.如何設(shè)計(jì)函數(shù)間的通信則又涉及到耦合性
3.如何設(shè)計(jì)函數(shù)的大小用以加強(qiáng)其聚合性及降低其耦合性
【聚合】
每個(gè)函數(shù)只做一件事
完美的程序設(shè)計(jì),每個(gè)函數(shù)應(yīng)該而且只需做一件事。
比如說(shuō):把大象放進(jìn)冰箱分三步:把門(mén)打開(kāi)、把大象放進(jìn)去、把門(mén)關(guān)上。
這樣就應(yīng)該寫(xiě)三個(gè)函數(shù)而不是一個(gè)函數(shù)拿所有的事全做了。這樣結(jié)構(gòu)清晰,層次分明,也好理解!
【大小】
保持簡(jiǎn)單、保持簡(jiǎn)短
Python即是面向過(guò)程的語(yǔ)言,也是面向?qū)ο蟮恼Z(yǔ)言,但更多的是充當(dāng)腳本語(yǔ)言的角色。
同樣的功能,使用Python來(lái)實(shí)現(xiàn)其代碼長(zhǎng)度也許是C/C++/Java等語(yǔ)言的1/3. 幾百行代碼就能實(shí)現(xiàn)不小的功能!
如果項(xiàng)目中設(shè)計(jì)的一個(gè)函數(shù)需要翻頁(yè)才能看完的話,就要考慮將函數(shù)拆分了。
在Python自帶的200多個(gè)模塊中,很少看到某個(gè)函數(shù)有兩、三頁(yè)的。
Python代碼以簡(jiǎn)單明了著稱,一個(gè)過(guò)長(zhǎng)或者有著深層嵌套的函數(shù)往往成為設(shè)計(jì)缺陷的征兆。
【耦合】
輸入使用參數(shù)、輸出使用return語(yǔ)句
這樣做可以讓函數(shù)獨(dú)立于它外部的東西。參數(shù)和return語(yǔ)句就是隔離外部依賴的最好的辦法。
慎用全局變量
第一重考慮: 全局變量通常是一種蹩腳的函數(shù)間的進(jìn)行通信的方式。
它會(huì)引發(fā)依賴關(guān)系和計(jì)時(shí)的問(wèn)題,從而會(huì)導(dǎo)致程序調(diào)試和修改的困難。
第二重考慮: 從代碼及性能優(yōu)化來(lái)考慮,本地變量遠(yuǎn)比全局變量快。
根據(jù)Python對(duì)變量的搜索的先后順序: 本地函數(shù)變量==》上層函數(shù)變量==》全局變量==》內(nèi)置變量
從上面可以看出,本地變量?jī)?yōu)先被搜索,一旦找到,就此停下。下面專門(mén)對(duì)其做了測(cè)試,測(cè)試結(jié)果如下:
import profile
A = 5
def param_test():
B = 5
res = 0
for i in range(100000000):
res = B + i
return res
if __name__=='__main__':
profile.run('param_test()')
>>> ===================================== RESTART =====================================
>>>
5 function calls in 37.012 seconds #全局變量測(cè)試結(jié)果:37 秒
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 19.586 19.586 19.586 19.586 :0(range)
1 1.358 1.358 1.358 1.358 :0(setprofile)
1 0.004 0.004 35.448 35.448 <string>:1(<module>)
1 15.857 15.857 35.443 35.443 Learn.py:5(param_test)
1 0.206 0.206 37.012 37.012 profile:0(param_test())
0 0.000 0.000 profile:0(profiler)
>>> ===================================== RESTART =====================================
>>>
5 function calls in 11.504 seconds #局部變量測(cè)試結(jié)果: 11 秒
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 3.135 3.135 3.135 3.135 :0(range)
1 0.006 0.006 0.006 0.006 :0(setprofile)
1 0.000 0.000 11.497 11.497 <string>:1(<module>)
1 8.362 8.362 11.497 11.497 Learn.py:5(param_test)
1 0.000 0.000 11.504 11.504 profile:0(param_test())
0 0.000 0.000 profile:0(profiler)
避免改變可變類型參數(shù)
Python數(shù)據(jù)類型比如說(shuō)列表、字典屬于可變對(duì)象。在作為參數(shù)傳遞給函數(shù)時(shí),有時(shí)會(huì)像全局變量一樣被修改。
這樣做的壞處是:增強(qiáng)了函數(shù)之間的耦合性,從而導(dǎo)致函數(shù)過(guò)于特殊和不友好。維護(hù)起來(lái)也困難。
這個(gè)時(shí)候就要考慮使用切片S[:]和copy模塊中的copy()函數(shù)和deepcopy()函數(shù)來(lái)做個(gè)拷貝,避免修改可變對(duì)象
具體參考這篇文章: Python中的深淺拷貝詳解
避免直接改變另一個(gè)模塊中的變量
比如說(shuō)在b.py文件中導(dǎo)入a模塊,a中有變量PI = 3.14, 但b.py想將其修改為:PI = 3.14159, 在這里你就搞不清楚變量PI原先的值到底是多少。碰到這種情況,可以考慮用易懂的函數(shù)名來(lái)實(shí)現(xiàn):
#模塊a.py PI = 3.14 def setPi(new): PI = new return PI
這樣既有自己想要的PI的值,又沒(méi)有改變a模塊中PI的值
import a PI = a.setPi(3.14159) print PI;a.PI
相關(guān)文章
Python光學(xué)仿真學(xué)習(xí)衍射算法初步理解
這篇文章主要為大家介紹了Python光學(xué)仿真學(xué)習(xí)中對(duì)衍射算法的初步理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
python+selenium實(shí)現(xiàn)163郵箱自動(dòng)登陸的方法
本篇文章主要介紹了python+selenium實(shí)現(xiàn)163郵箱自動(dòng)登陸的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Python重復(fù)文件批量整理工具的設(shè)計(jì)與實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何通關(guān)Python編寫(xiě)一個(gè)重復(fù)文件批量整理工具,可以在文件夾內(nèi)對(duì)文件進(jìn)行去重和分類存儲(chǔ),有需要的可以了解下2025-02-02
啥是佩奇?使用Python自動(dòng)繪畫(huà)小豬佩奇的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于啥是佩奇?使用Python自動(dòng)繪畫(huà)小豬佩奇的代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
《Python學(xué)習(xí)手冊(cè)》學(xué)習(xí)總結(jié)
本篇文章是讀者朋友在學(xué)習(xí)了《Python學(xué)習(xí)手冊(cè)》這本書(shū)以后,總結(jié)出的學(xué)習(xí)心得,值得大家參考學(xué)習(xí)。2018-01-01
詳解Python如何利用petl做數(shù)據(jù)遷移
隨著數(shù)據(jù)量的不斷增長(zhǎng),數(shù)據(jù)遷移成為了一項(xiàng)必不可少的任務(wù),本文就來(lái)為大家詳細(xì)介紹一下如何使用PETL進(jìn)行數(shù)據(jù)遷移,并給出一些實(shí)踐案例,需要的可以參考下2024-01-01
http請(qǐng)求 request失敗自動(dòng)重新嘗試代碼示例
這篇文章主要介紹了http請(qǐng)求 request失敗自動(dòng)重新嘗試代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Python實(shí)戰(zhàn)小項(xiàng)目之身份證信息校驗(yàn)
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Python做一個(gè)身份證信息校驗(yàn)的小項(xiàng)目,大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-10-10

