Python函數設計原則
來源:程序員人生 發布時間:2015-01-15 08:29:31 閱讀次數:4914次
在任何編程語言中,函數的利用主要出于以下兩種情況:
- 代碼塊重復,這時候候必須斟酌用到函數,下降程序的冗余度
- 代碼塊復雜,這時候候可以斟酌用到函數,增強程序的可讀性
當流程足夠復雜時,就要斟酌函數,及如何將函數組合在1起。在Python中做函數設計,主要斟酌到函數大小、聚合性、耦合性3個方面,這3者應當歸結于計劃與設計的范疇。高內聚、低耦合則是任何語言函數設計的整體原則。
- 如何將任務分解成更有針對性的函數從而致使了聚合性
- 如何設計函數間的通訊則又觸及到耦合性
- 如何設計函數的大小用以加強其聚合性及下降其耦合性
【聚合】
完善的程序設計,每一個函數應當而且只需做1件事。
比如說:把大象放進冰箱分3步:把門打開、把大象放進去、把門關上。
這樣就應當寫3個函數而不是1個函數拿所有的事全做了。這樣結構清晰,層次分明,也好理解!
【大小】
Python即是面向進程的語言,也是面向對象的語言,但更多的是充當腳本語言的角色。
一樣的功能,使用Python來實現其代碼長度或許是C/C++/Java等語言的1/3. 幾百行代碼就可以實現不小的功能!
如果項目中設計的1個函數需要翻頁才能看完的話,就要斟酌將函數拆分了。
在Python自帶的200多個模塊中,很少看到某個函數有兩、3頁的。
Python代碼以簡單明了著稱,1個太長或有著深層嵌套的函數常常成為設計缺點的征象。
【耦合】
這樣做可讓函數獨立于它外部的東西。參數和return語句就是隔離外部依賴的最好的辦法。
第1重斟酌: 全局變量通常是1種蹩腳的函數間的進行通訊的方式。
它會引發依賴關系和計時的問題,從而會致使程序調試和修改的困難。
第2重斟酌: 從代碼及性能優化來斟酌,本地變量遠比全局變量快。
根據Python對變量的搜索的前后順序:
本地函數變量==》上層函數變量==》全局變量==》內置變量
從上面可以看出,本地變量優先被搜索,1旦找到,就此停下。下面專門對其做了測試,測試結果以下:
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 #全局變量測試結果: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 #局部變量測試結果: 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)
Python數據類型比如說列表、字典屬于可變對象。在作為參數傳遞給函數時,有時會像全局變量1樣被修改。
這樣做的壞處是:增強了函數之間的耦合性,從而致使函數過于特殊和不友好。保護起來也困難。
這個時候就要斟酌使用切片S[:]和copy模塊中的copy()函數和deepcopy()函數來做個拷貝,避免修改可變對象
具體參考這篇文章:
Python中的深淺拷貝詳解
比如說在b.py文件中導入a模塊,a中有變量PI = 3.14, 但b.py想將其修改成:PI = 3.14159, 在這里你就弄不清楚變量PI本來的值究竟是多少。碰到這類情況,可以斟酌用易懂的函數名來實現:
#模塊a.py
PI = 3.14
def setPi(new):
PI = new
return PI
這樣既有自己想要的PI的值,又沒有改變a模塊中PI的值import a
PI = a.setPi(3.14159)
print PI;a.PI
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈