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

來源:互聯網
上載者:User

總結的幾個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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.