欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則

 更新時(shí)間:2015年06月03日 10:31:36   投稿:junjie  
這篇文章主要介紹了總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則,本文講解了每個(gè)函數(shù)只做一件事、保持簡(jiǎn)單、保持簡(jiǎn)短、輸入使用參數(shù)、輸出使用return語(yǔ)句等內(nèi)容,需要的朋友可以參考下

在任何編程語(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)先被搜索,一旦找到,就此停下。下面專(zhuān)門(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) 



避免改變可變類(lèi)型參數(shù)

Python數(shù)據(jù)類(lèi)型比如說(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 基于卡方值分箱算法的實(shí)現(xiàn)示例

    python 基于卡方值分箱算法的實(shí)現(xiàn)示例

    這篇文章主要介紹了python 基于卡方值分箱算法的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • pandas中的.assign()方法的用法示例小結(jié)

    pandas中的.assign()方法的用法示例小結(jié)

    pandas中的.assign()方法用于創(chuàng)建一個(gè)新的DataFrame,其中包含現(xiàn)有DataFrame的副本,并附加了指定的新列或更新了現(xiàn)有列,.assign()方法還可以鏈?zhǔn)绞褂?以添加多個(gè)新列或更新現(xiàn)有列,對(duì)pandas中的.assign()方法感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • pycharm導(dǎo)入第三方庫(kù)的兩種方法(永不報(bào)錯(cuò))

    pycharm導(dǎo)入第三方庫(kù)的兩種方法(永不報(bào)錯(cuò))

    這篇文章主要介紹了pycharm導(dǎo)入第三方庫(kù)的兩種方法(永不報(bào)錯(cuò)),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • python實(shí)現(xiàn)rest請(qǐng)求api示例

    python實(shí)現(xiàn)rest請(qǐng)求api示例

    這篇文章主要介紹了python實(shí)現(xiàn)rest請(qǐng)求api示例,需要的朋友可以參考下
    2014-04-04
  • Python中向一個(gè)集合添加值的操作方法

    Python中向一個(gè)集合添加值的操作方法

    從數(shù)學(xué)上講,集合是一個(gè)在邏輯上有聯(lián)系的不同對(duì)象的集合,在Python中,集合是一個(gè)內(nèi)置的數(shù)據(jù)類(lèi)型,它是無(wú)索引的和不可變的,這篇文章主要介紹了Python中向一個(gè)集合添加值的操作方法,需要的朋友可以參考下
    2023-10-10
  • numpy.std() 計(jì)算矩陣標(biāo)準(zhǔn)差的方法

    numpy.std() 計(jì)算矩陣標(biāo)準(zhǔn)差的方法

    今天小編就為大家分享一篇numpy.std() 計(jì)算矩陣標(biāo)準(zhǔn)差的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Python合并兩個(gè)字典的常用方法與效率比較

    Python合并兩個(gè)字典的常用方法與效率比較

    這篇文章主要介紹了Python合并兩個(gè)字典的常用方法與效率比較,實(shí)例分析并對(duì)比了Python合并字典的常用方法,需要的朋友可以參考下
    2015-06-06
  • python3實(shí)現(xiàn)TCP協(xié)議的簡(jiǎn)單服務(wù)器和客戶端案例(分享)

    python3實(shí)現(xiàn)TCP協(xié)議的簡(jiǎn)單服務(wù)器和客戶端案例(分享)

    下面小編就為大家?guī)?lái)一篇python3實(shí)現(xiàn)TCP協(xié)議的簡(jiǎn)單服務(wù)器和客戶端案例(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • python截取兩個(gè)單詞之間的內(nèi)容方法

    python截取兩個(gè)單詞之間的內(nèi)容方法

    今天小編就為大家分享一篇python截取兩個(gè)單詞之間的內(nèi)容方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python利用imshow制作自定義漸變填充柱狀圖(colorbar)

    Python利用imshow制作自定義漸變填充柱狀圖(colorbar)

    這篇文章主要介紹了Python利用imshow制作自定義漸變填充柱狀圖(colorbar),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論