99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀總結的幾個Python函數(shù)方法設計原則
總結的幾個Python函數(shù)方法設計原則
2017-08-27
收藏

總結的幾個Python函數(shù)方法設計原則

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

1.代碼塊重復,這時候必須考慮用到函數(shù),降低程序的冗余度
2.代碼塊復雜,這時候可以考慮用到函數(shù),增強程序的可讀性

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

1.如何將任務分解成更有針對性的函數(shù)從而導致了聚合性
2.如何設計函數(shù)間的通信則又涉及到耦合性
3.如何設計函數(shù)的大小用以加強其聚合性及降低其耦合性

【聚合】

每個函數(shù)只做一件事

完美的程序設計,每個函數(shù)應該而且只需做一件事。
比如說:把大象放進冰箱分三步:把門打開、把大象放進去、把門關上。
這樣就應該寫三個函數(shù)而不是一個函數(shù)拿所有的事全做了。這樣結構清晰,層次分明,也好理解!

【大小】

保持簡單、保持簡短

Python即是面向過程的語言,也是面向對象的語言,但更多的是充當腳本語言的角色。
同樣的功能,使用Python來實現(xiàn)其代碼長度也許是C/C++/Java等語言的1/3. 幾百行代碼就能實現(xiàn)不小的功能!
如果項目中設計的一個函數(shù)需要翻頁才能看完的話,就要考慮將函數(shù)拆分了。
在Python自帶的200多個模塊中,很少看到某個函數(shù)有兩、三頁的。
Python代碼以簡單明了著稱,一個過長或者有著深層嵌套的函數(shù)往往成為設計缺陷的征兆。

【耦合】

輸入使用參數(shù)、輸出使用return語句

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

慎用全局變量

第一重考慮: 全局變量通常是一種蹩腳的函數(shù)間的進行通信的方式。
它會引發(fā)依賴關系和計時的問題,從而會導致程序調試和修改的困難。

第二重考慮: 從代碼及性能優(yōu)化來考慮,本地變量遠比全局變量快。
根據(jù)Python對變量的搜索的先后順序: 本地函數(shù)變量==》上層函數(shù)變量==》全局變量==》內置變量
從上面可以看出,本地變量優(yōu)先被搜索,一旦找到,就此停下。下面專門對其做了測試,測試結果如下:

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:1()
    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:1()
    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)

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

Python數(shù)據(jù)類型比如說列表、字典屬于可變對象。在作為參數(shù)傳遞給函數(shù)時,有時會像全局變量一樣被修改。

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

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

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

比如說在b.py文件中導入a模塊,a中有變量PI = 3.14, 但b.py想將其修改為:PI = 3.14159, 在這里你就搞不清楚變量PI原先的值到底是多少。碰到這種情況,可以考慮用易懂的函數(shù)名來實現(xiàn):    
#模塊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


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師考試動態(tài)
數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調,回調的第一個參數(shù)驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }