![學會合理分解代碼提高可讀性_第1頁](http://file4.renrendoc.com/view/51b8421e114ee352854a7a113fc3233d/51b8421e114ee352854a7a113fc3233d1.gif)
![學會合理分解代碼提高可讀性_第2頁](http://file4.renrendoc.com/view/51b8421e114ee352854a7a113fc3233d/51b8421e114ee352854a7a113fc3233d2.gif)
![學會合理分解代碼提高可讀性_第3頁](http://file4.renrendoc.com/view/51b8421e114ee352854a7a113fc3233d/51b8421e114ee352854a7a113fc3233d3.gif)
![學會合理分解代碼提高可讀性_第4頁](http://file4.renrendoc.com/view/51b8421e114ee352854a7a113fc3233d/51b8421e114ee352854a7a113fc3233d4.gif)
![學會合理分解代碼提高可讀性_第5頁](http://file4.renrendoc.com/view/51b8421e114ee352854a7a113fc3233d/51b8421e114ee352854a7a113fc3233d5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
27-學會合理分解代碼,提高代碼可讀 深入到細節(jié)代碼,無需注釋也能理解清清楚楚。而有些人,代碼勉勉強強能跑起來,遇到稍微復雜的情況可能就會出;深入到代碼中eu,則發(fā)現處處都是魔術數、函數堆在起。個文件上千行,設計模式又是,讓人實在很難閱讀,更別提修和迭發(fā)。uidovanRossum(范姆,to創(chuàng)始人),代的閱讀頻遠高于編代碼的頻。畢PEP8上節(jié)課我們簡單提起過PEP8PEP是PythonEnhancementProposal的縮寫,翻譯過來叫“Python增強規(guī)范”。正如我們寫文章,會有句式、標點、段落格式、開頭縮進等標準的規(guī)范樣,Python書寫自然也有套較為的規(guī)范。PEP8就是這樣種規(guī)范,它存在的意義,就是讓Python更易閱讀,換句話,增強代碼可讀性。事實上,Pycharm已經內置了PEP8規(guī)范檢測器,它會自動對編碼不規(guī)范的地方進行檢查,然后錯誤,并推薦修改方式。下面這就是其界面。因此,在學習今天的內容時,我推薦你使用camE進行代碼檢查,看 下自己的代碼格式哪里有問題。尤其對于初學者,從某些程度來說,代碼規(guī)范甚至是比代碼準確更重要的事情,因為實際工作中,代可讀性的重要性 定比你多得多。縮進規(guī)Python和C++/Java最大的不同在于,后者完全使用大括號來區(qū)分代碼塊,而前者依靠不和不同的縮進來進行分塊。有個很有名的比賽,叫作C語言代碼大賽,其中有很多非常的作品,你能看到書寫的代碼拍成各種形狀,有的是幅畫,或者個卡通頭像,但是能執(zhí)行出驚人的結果。而放到Python,顯然就不能實現同樣的技巧了。不過,以小換大,我們有了“像閱讀英語”樣清晰的Python代碼,也還是可以接受的話說回來,Python縮進其實可以寫成很多種,Tab、雙空格、四空格、Tab合等。而PEP8規(guī)范告訴我們,請選擇四個空格的縮進,不要使用Tab,更不要Tab和空格混著用。第二個要注意的是,每行最大長度請限制在79個字符。 多個源代碼。如果某個源代碼的某些行過長,你就需要拖動橫向滾動條來閱讀,或者需要軟回車將本行內放入 行,這就極大地影響了編碼和閱讀效率 后,行的內容就很容易超過79個字符了。所以,這條規(guī)定另方面也在制約著程序員,不要寫迭代過深空行規(guī)我們知道,Python中的空行對PythonP8另外,Python本身允許把多行合并為行,使用分號隔開,但這是PEP8推薦的做法。所以,即使是使用控制語句ifwhilefor,你的執(zhí)行語句哪怕只有行命令,也請另起行,這樣可以更大程度提升閱讀 空格規(guī) 函數的參數列表中,調用函數的參數列表中會出現逗號,請注意逗號后要跟個空格,這是英語的使用習慣, 另外 對于操作符,例如+,-,*,/,&=,==,!=,請在兩邊都保留空格。不過與此對應,括號內的兩端并換行規(guī)現在再回到縮進規(guī)范,注意我們提到的第二點,控制每行的最大長度不超過79個字符,但是有時候,函數defsolve1(thisisthefirstparameter,thisisthesecondparameter,thisisthethirdparameter,thisistheforthparameter,thisisthefifthparameter,thisisthesixthdefsolve1(thisisthefirstparameter,thisisthesecondparameter,thisisthethirdparameter,thisistheforthparameter,thisisthefifthparameter,thisisthesixthreturn(thisisthefirstparameter+thisisthesecondparameter+thisisthethirdparameterthisistheforthparameter+thisisthefifthparameter+thisisthesixthdefsolve2(thisisthefirstparameter,thisisthesecondparameter,thisisthethirdparameter,thisistheforthparameter,thisisthefifthparameter,thisisthesixthreturnthisisthefirstparameter+thisisthesecondparameter+thisisthethirdparameter+thisthisistheforthparameter+thisisthefifthparameter+thisisthesixth(topsecret,,,,.launchnucleartopsecret,,,,.launchnuclear 個邏輯之下。solve1函數 第二種,則是通過換行符來實現。這個方法更為直接,你可以從solve2 下面的代碼選自開源庫lwKa,為了更加直觀突出重點,我刪去了注釋和大部分代碼,你意會即可。我希望,通過閱讀這段代碼,你能更了解到,前沿的項目是怎么在增強閱讀性上下功的。classclassModel(network.Network):deffit(self,batchsize=None,validationsplit=0.,validationdata=None,shuffle=rue,classweight=None,sampleweight=None,initialepoch=0,stepsperepoch=None,validationsteps=None,validationfreq=1,maxqueuesize=10,use#Legacyif'nbepoch'inkwargs:'he`nbepoch`argumentin`fit`hasbeenrenamed`epochs`.')epochs=kwargs.pop('nbepoch')ifraiseypeError('Unrecognizedkeywordarguments:'+str(kwargs))self.assertcompilewascalled()funcfunc=self.selecttrainingloop(x)returnfunc.fit(batchsize=batchsize,validationsplit=validationsplit,validationdata=validationdata,classweight=classweight,sampleweight=sampleweight,initialepoch=initialepoch,stepsperepoch=stepsperepoch,validationsteps=validationsteps,validationfreq=validationfreq,maxqueuesize=maxqueuesize,usemultiprocessing=use文檔規(guī)接下來我們說說文檔規(guī)范。先來看看最常用的import函數。首先,所有import盡量放在開頭,這個沒什么說的,畢竟到處import讓人很難看清楚文件之間的依賴關系,運行時import也可能會導致潛在的效率問題和其他風險。其次,不要使用import 次導入多個模塊。雖然我們可以在行中import多個模塊,并用逗號分隔,但請不要這么做。importtime,os是PEP8不推薦的做法。如果你采用frommoduleimportfunc這樣的語句,請確保func在本文件中不會出現命名。不過,你其實可以通過frommoduleimportfuncasnew_func來進行重命名,從而避免。注釋規(guī) 對于大的邏輯塊,我們可以在最開始相同的縮進處以#開始寫注釋。即使是注釋,你也應該把它當成完整的文章來書寫。如果英文注釋,請注意開頭大寫及結尾標點,注意避免語法錯誤和邏輯錯誤,同時精簡要達的意思。中文注釋也是同樣的要求。 份優(yōu)秀的代碼,離不開優(yōu)秀的注釋。 行后面跟兩個空格,然后以#開頭加入注釋。不過,請注##hisisanexampletodemonstratehowtocomment.#Pleasenotethisfunctionmustbeusedcarefully.defifx==1:#hisisonlyoneexception.returnFalsereturnreturn文檔描再來說說文檔描述,我們繼續(xù)以TensorFlow的代碼為例。classSpatialDropout2D(Dropout):"""Spatial2DversionofDropout.hisversionperformsthesamefunctionasDropout,howeveritdropsentire2Dfeaturemapsinsteadofindividualelements.fadjacentpixelswithinfeaturemapsarestronglycorrelated(asisnormallythecaseinearlyconvolutionlayers)thenregulardropoutwillnotregularizetheactivationsandwillotherwisejustresultinaneffectivelearningratedecrease.nthiscase,SpatialDropout2Dwillhelppromoteindependencebetweenfeaturemapsandshouldbeusedinstead.rate:floatbetween0and1.Fractionoftheinputunitstodrop.dataformat:'channelsfirst'or'channelslast'.n'channelsfirst'mode,thechannelsdimension(thedepth)isatindex1,in'channelslast'modeisitatindextdefaultstothe`imagedataformat`valuefoundinyourKerasconfigfileat`~/.keras/keras.json`.fyouneversetit,thenitwillbe"channelslast".nputshape:4Dtensorwith`(samples,channels,rows,cols)`ifdataformat='channelsfirst'or4Dtensorwithshape:`(samples,rows,cols,channels)`ifdataformat='channelsOutputSameasinput[EfficientObjectLocalizationUsingConvolutional init(self,rate,dataformat=None,**kwargs):super(SpatialDropout2D,self).init(rate,**kwargs)ifdataformatisNone:dataformat=K.imagedataifdataformatnotin{'channelslast','channelsfirst'}:raiseValueError('dataformatmustbein''{"channelslast","channelsfirst"}')self.dataformat=dataformatself.inputspec=的返回值和格式,以及其他需要注意的地方。至于docstring的寫法,它是用三個雙引號開始、三個雙引號結尾。我們首先用 命名規(guī) 程序員來說,是個不算的事。個具有誤導性的名字,極有可能在項目中埋下潛在的bug。這里我就不從命名分類方法來給你劃分了,我們只講些最實用的規(guī)范。先來看變量命名。變量名請使用abcd這樣毫無意義的單字符,我們應該使用能夠代表其意思的變量名。般來說,變量使用小寫,通過下劃線串聯起來,例 可以使用單字符的地方是迭代,比如foriinrange(n)這種,為了精簡可以使用。如果是類的私有變量,請記得前面增加兩個下劃線。對于類名,則應該首字母大寫,然后合并起來,例如:classSpatialDropout2D()、class總之,還是那句話,不要過于個變量名的長度。當然,在合理描述這個變量背后代表的對象后, 編程中個思想,寫重復碼重復代大率可以過用條件循、構造數類來解。而另個想則是,少迭代層,盡可能讓thon代碼平化,畢,人的大無法處理多的棧所以,在很多業(yè)務邏輯比較復雜的地方,就需要我們加入大量的判斷和循環(huán)。不過,這些旦沒寫好,程序看 ififiammoney=100money=10 ififiammoney=100money=再來 defdefifisserverdead:LOG('serverdead')ifisservertimedout:LOG('servertimedout')result=getresultfromserver()ifresult==MONEYSNOLOG('youdonothaveenoughmoney')ifresult==RANSACONSUCCEED:LOG('somethingwrong') 下defdefifisserverdead:LOG('serverdead')ifisservertimedout:LOG('servertimedout')result=getresultfromifresult==MONE SNOENOUGH:LOG('youdonothaveenoughmoney')ifresult==RANSACONSUCCEED:LOG('something 這里,我以個簡單的二分搜索來舉例說明。我給定個非遞減整數數組,和個target,要求你找到數組中最小的個數x,可以滿足x*x>target。旦不存在,則返回-1。 defdefsolve(arr,target):l,r=0,len(arr) ret=whilel<=m=(l+r)//ifarr[m]*arr[m]>target:ret=mr= l=m+1ifret==1:returnreturnprint(solve([1,2,3,4,5,6],print(solve([1,2,3,4,5,6],print(solve([1,2,3,4,5,6],print(solve([1,2,3,4,5,6], 段代碼這樣的寫法,在算法比賽和面試中已經OK了。不過,從工程角度來說,我們還能繼續(xù) defdefcomp(x,returnx*x>defbinarysearch(arr,target):l,r=0,len(arr) ret=whilel<=m=(l+r)//ifcomp(arr[m],target):ret=mr= l=m+1returnretdefsolve(arr,id=binarysearch(arr,ifid!=returnarr[id]return1print(solve([1,2,print(solve([1,2,3,4,5,6],print(solve([1,2,3,4,5,6],print(solve([1,2,3,4,5,6],print(solve([1,2,3,4,5,6],你可以看出,第二段代碼中,我把不同功能的代碼拿了出來。其中,)函數作為判斷,拿出來后可以讓整個程序更清晰;同時,我也把二分搜索的主程序拿了出來,只負責二分搜索;最后的ve()拿到結果,決定返回不存在,還是返回值。這樣來,每個函數各司其職,閱讀性也能得到定提高。 : init(self,=,age,jobtitle,job self.age=ageself.jobtitle=jobtitleself.jobdescription=descriptionpanyname 你應該能看得出來,job在其中出現了很多次,而且它們表達的是個意義實體,這種情況下,我們可以考: init(self,=,age,jobtitle,job self.age=ageself.job=Job(jobtitle,job class init(self,jobtitle,jobself.jobtitle=jobtitleself.jobdescription=descriptionpanyname 今天這節(jié)課,我們簡單講述了如何提高Python代碼的可讀性,主要介紹了PEP8規(guī)范,并通過實例的說明和改造,讓你清楚如何對Python程序進行可讀性優(yōu)化。最后, 規(guī)范問題而犯下的錯誤,和這些錯誤會導致什么樣的,比如對后來讀代碼的人有嚴重的誤導,或是埋下了潛在的bug等等。希望你在留言區(qū)你的經歷,你也可以把這篇文章出去,讓的人互相交流心得體會,留下真實的oWorld2019-07-11 個空 個空 當使用控制語句if/while/for時,即使執(zhí)行語句只 個空 個空列表、元組、字典的元間要 個空 個空使用#注釋的話,#后要 個空 般我們通過代碼邏輯拆分等來控制每行的最大長度不超過79字時還是不可避免的會超過這個限制,這個時候就需要通過換行來解決問題了。 所有import盡量放在代碼文件的頭每行import只導 個對當我們使用fromxxximportxxx時,import后面跟著的對象要是 個類或者個函數 行的相同縮進處以#開始書寫注代碼行注釋,在代碼行的尾部跟2 變量名,要全部小寫,多個詞通過下劃線連接,可以使用單字符變量名的場景,比如friina()這種變量沒有實際意義的情況 夜路破曉2019-07-10求時再來關注代碼規(guī)范之類的問題。 項個認知:寫漂亮代碼與寫能跑起來的代碼之間不存在因果關系,兩者都是你需要花費時間精力學習的內容 點,越能合理而高效地安排自己的學習計劃。[3贊new2019-07-10如果代碼邏輯清晰,加上注釋是錦上添花的事,相對寫代碼和讀代碼,程序員更愿意自己寫代碼,而在項目中又必須
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京課改版歷史七年級上冊第11課《秦朝的統(tǒng)一》聽課評課記錄
- 新人教版九年級歷史下冊第19課《現代音樂和電影》聽課評課記錄
- 蘇科版九年級數學聽評課記錄:第31講 與圓有關的位置關系
- 人教版九年級數學下冊:29《復習題》聽評課記錄1
- 二年級體育聽評課記錄
- 首師大版道德與法治七年級下冊1.2《彼此尊重顯自尊》聽課評課記錄
- 五年級數學下冊聽評課記錄-《6 圓的面積》蘇教版
- 蘇教版小學數學四年級上口算部分
- 三年級語文教學計劃模板
- 新員工入職工作計劃書
- 人教版小學數學(2024)一年級下冊第五單元100以內的筆算加、減法綜合素養(yǎng)測評 B卷(含答案)
- 2024-2025學年北京市豐臺區(qū)高三語文上學期期末試卷及答案解析
- 2024年度體育賽事贊助合同:運動員代言與贊助權益2篇
- 2025屆西藏林芝一中高三第二次診斷性檢測英語試卷含解析
- 藥企銷售總經理競聘
- 開封市第一屆職業(yè)技能大賽健康照護項目技術文件(國賽)
- 公路電子收費系統(tǒng)安裝合同范本
- 醫(yī)院培訓課件:《傷口評估與測量》
- 2021年全國高考物理真題試卷及解析(全國已卷)
- 期末試卷(試題)-2024-2025學年四年級上冊數學滬教版
- 《第一單元口語交際:即興發(fā)言》教案-2023-2024學年六年級下冊語文統(tǒng)編版
評論
0/150
提交評論