程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 總結的幾個Python函數方法設計原則

總結的幾個Python函數方法設計原則

編輯:更多關於編程

       這篇文章主要介紹了總結的幾個Python函數方法設計原則,本文講解了每個函數只做一件事、保持簡單、保持簡短、輸入使用參數、輸出使用return語句等內容,需要的朋友可以參考下

      在任何編程語言中,函數的應用主要出於以下兩種情況:

      1.代碼塊重復,這時候必須考慮用到函數,降低程序的冗余度

      2.代碼塊復雜,這時候可以考慮用到函數,增強程序的可讀性

      當流程足夠繁雜時,就要考慮函數,及如何將函數組合在一起。在Python中做函數設計,主要考慮到函數大小、聚合性、耦合性三個方面,這三者應該歸結於規劃與設計的范疇。高內聚、低耦合則是任何語言函數設計的總體原則。

      1.如何將任務分解成更有針對性的函數從而導致了聚合性

      2.如何設計函數間的通信則又涉及到耦合性

      3.如何設計函數的大小用以加強其聚合性及降低其耦合性

      【聚合】

      每個函數只做一件事

      完美的程序設計,每個函數應該而且只需做一件事。

      比如說:把大象放進冰箱分三步:把門打開、把大象放進去、把門關上。

      這樣就應該寫三個函數而不是一個函數拿所有的事全做了。這樣結構清晰,層次分明,也好理解!

      【大小】

      保持簡單、保持簡短

      Python即是面向過程的語言,也是面向對象的語言,但更多的是充當腳本語言的角色。

      同樣的功能,使用Python來實現其代碼長度也許是C/C++/Java等語言的1/3. 幾百行代碼就能實現不小的功能!

      如果項目中設計的一個函數需要翻頁才能看完的話,就要考慮將函數拆分了。

      在Python自帶的200多個模塊中,很少看到某個函數有兩、三頁的。

      Python代碼以簡單明了著稱,一個過長或者有著深層嵌套的函數往往成為設計缺陷的征兆。

      【耦合】

      輸入使用參數、輸出使用return語句

      這樣做可以讓函數獨立於它外部的東西。參數和return語句就是隔離外部依賴的最好的辦法。

      慎用全局變量

      第一重考慮: 全局變量通常是一種蹩腳的函數間的進行通信的方式。

      它會引發依賴關系和計時的問題,從而會導致程序調試和修改的困難。

      第二重考慮: 從代碼及性能優化來考慮,本地變量遠比全局變量快。

      根據Python對變量的搜索的先後順序: 本地函數變量==》上層函數變量==》全局變量==》內置變量

      從上面可以看出,本地變量優先被搜索,一旦找到,就此停下。下面專門對其做了測試,測試結果如下:

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 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數據類型比如說列表、字典屬於可變對象。在作為參數傳遞給函數時,有時會像全局變量一樣被修改。

      這樣做的壞處是:增強了函數之間的耦合性,從而導致函數過於特殊和不友好。維護起來也困難。

      這個時候就要考慮使用切片S[:]和copy模塊中的copy()函數和deepcopy()函數來做個拷貝,避免修改可變對象

      具體參考這篇文章: Python中的深淺拷貝詳解

      避免直接改變另一個模塊中的變量

      比如說在b.py文件中導入a模塊,a中有變量PI = 3.14, 但b.py想將其修改為:PI = 3.14159, 在這裡你就搞不清楚變量PI原先的值到底是多少。碰到這種情況,可以考慮用易懂的函數名來實現:

      ?

    1 2 3 4 5 6 #模塊a.py PI = 3.14   def setPi(new): PI = new return PI

      這樣既有自己想要的PI的值,又沒有改變a模塊中PI的值

      ?

    1 2 3 4 import a   PI = a.setPi(3.14159) print PI;a.PI
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved