1.代碼塊被復制。這時候就必須考慮函數,減少程序的冗余。
2.代碼塊很復雜。這時可以考慮用函數來增強程序的可讀性。
當流程足夠復雜時,就要考慮功能以及如何組合。Python中的函數設計主要考慮三個方面:函數大小、聚合和耦合,應該歸屬於規劃設計的範疇。高內聚和低耦合是任何語言功能設計的壹般原則。
1.如何將任務分解成更有針對性的功能,從而產生聚合。
2.如何設計函數間的通信涉及到耦合。
3.如何設計函數的大小以增強其聚集性,降低其耦合性?
聚合
每個函數只做壹件事。
完美的編程,每個函數應該且只需要做壹件事。
比如把大象放進冰箱,分三步:開門、放大象進去、關門。
所以妳應該寫三個函數而不是壹個函數來做所有的事情。這個結構清晰,層次分明,簡單易懂!
大小
保持簡單和簡短。
Python既是面向過程的語言,也是面向對象的語言,但更多的是壹種腳本語言。
同樣的功能,用Python實現其代碼長度可能是C/C++/Java等語言的1/3。幾百行代碼可以實現很多功能!
如果項目中設計的某個功能需要翻頁才能完成閱讀,就要考慮拆分功能了。
在Python的200多個模塊中,很少看到壹個函數有兩三頁。
Python代碼以簡單著稱,過長或嵌套過深的函數通常是設計缺陷的標誌。
連接
使用參數輸入,使用return語句輸出。
這樣做可以使函數獨立於外部。參數和返回語句是隔離外部依賴的最佳方式。
謹慎使用全局變量
首先要考慮的是:全局變量通常是函數間交流的蹩腳方式。
會導致依賴和時序問題,導致程序調試和修改困難。
第二點考慮:從代碼和性能優化的角度來看,局部變量比全局變量快得多。
按照Python對變量的搜索順序:局部函數變量= = "上層函數變量= = "全局變量= = "內置變量。
從上面可以看出,先搜索局部變量,壹旦找到就停止。下面是壹個特殊的測試,測試結果如下:
導入配置文件
A = 5
def參數測試():
B = 5
res = 0
對於範圍內的I(10000000):
res = B + i
返回資源
if __name__=='__main__ ':
profile.run('param_test()')
& gt& gt& gt============================ = = =重啟= = = = = = = = = = = = = = = = = = = = = = = = = = = =
& gt& gt& gt
37.012秒內5次函數調用#全局變量測試結果:37秒。
排序依據:標準名稱
n調用總時間百分比調用累計時間百分比調用文件名:行號(函數)
1 19.586 19.586 19.586 19.586:0(範圍)
1 1.358 1.358 1.358 1.358:0(set profile)
1 0.004 0.004 35.448 35.448 :1()
1 15.857 15.857 35.443 35.443 learn . py:5(param _ test)
1 0.206 0.206 37.012 37.012配置文件:0(param_test())
0 0.000 0.000配置文件:0(探查器)
& gt& gt& gt============================ = = =重啟= = = = = = = = = = = = = = = = = = = = = = = = = = = =
& gt& gt& gt
11.504秒內5次函數調用#局部變量測試結果:11秒。
排序依據:標準名稱
n調用總時間百分比調用累計時間百分比調用文件名:行號(函數)
1 3.135 3.135 3.135 3.135:0(範圍)
1 0.006 0.006 0.006 0.006:0(set profile)
1 0.000 0.000 11.497 11.497 :1()
1 8.362 8.362 11.497 11.497 learn . py:5(param _ test)
1 0.000 0.000 11.504 11.504配置文件:0(param_test())
0 0.000 0.000配置文件:0(探查器)
避免更改變量類型參數。
列表和字典等Python數據類型是可變對象。當作為參數傳遞給函數時,它有時會像全局變量壹樣被修改。
這樣做的缺點是增強了功能之間的耦合性,導致功能過於特殊,不友好。也很難維持。
這時要考慮使用slice S[:]和copy模塊中的copy()函數和deepcopy()函數進行復制,避免修改可變對象。
詳情請參考本文:Python中深度和淺層復制的詳細講解。
避免在另壹個模塊中直接改變變量。
比如妳把模塊A導入到壹個b.py文件中,A中有壹個變量PI = 3.14,但是b.py想把它修改成:PI = 3.14159,這樣妳就搞不清楚變量PI的初始值是什麽了。在這種情況下,您可以考慮使用易於理解的函數名:
#模塊a.py
PI = 3.14
def setPi(新):
PI =新
返回PI
這不僅有妳想要的圓周率的值,而且不會改變模塊a中圓周率的值。
導入a
PI = a.setPi(3.14159)
打印PI;答:PI