??? 2.2? Python的編碼規(guī)則
??? Python語言有自己獨(dú)特的編碼規(guī)則,包括命名規(guī)則、代碼書寫規(guī)則等。本節(jié)將詳細(xì)介紹Python中常用的規(guī)則,并解釋這些規(guī)則的原理和由來。
??? 2.2.1? 命名規(guī)則
??? Python語言有一套自己的命名規(guī)則,用戶也可以借鑒Java語言的命名規(guī)則以形成自己編碼的規(guī)則。命名規(guī)則并不是規(guī)定,只是一種習(xí)慣用法。變量名的首字符必須是字母或下劃線,首字符之外的字符可以由字母、數(shù)字或下劃線組成,并且不能使用Python的保留字。下面介紹幾種常見的規(guī)則。
??? 1.變量名、包名、模塊名
??? 變量名通常由字母和下劃線組成,包名、模塊名通常用小寫字母,如【例2-1】所示。
??? 【例2-1】演示變量名、包名、模塊名的規(guī)范寫法。
??? # 變量、模塊名的命名規(guī)則
??? # Filename: ruleModule.py
??? _rule = "rule information"
??? 第1行代碼是程序代碼的注釋,關(guān)于Python語言的注釋請(qǐng)參見2.2.5節(jié)。
??? 第2行代碼也是程序的注釋,用于聲明模塊的名稱,模塊名用小寫字母。也可以不指定模塊名,以py后綴的文件就是一個(gè)模塊。模塊名就是文件名。
??? 第4行代碼定義了一個(gè)全局變量_rule。
??? 2.類名、對(duì)象名
??? 類名首字母用大寫,其他字母采用小寫。對(duì)象名用小寫字母。類的屬性和方法名以對(duì)象作為前綴,對(duì)象通過操作符“.”訪問屬性和方法。類的私有變量、私有方法以兩個(gè)下劃線作為前綴。如【例2-2】所示。
??? 【例2-2】演示類的定義和實(shí)例化的規(guī)范寫法。
??? class Student:# 類名用大寫字母
??? __name = ""# 私有實(shí)例變量前必須有兩個(gè)下劃線
??? def __init__(self, name):
??? self.__name = name# self相當(dāng)于Java中的this
??? def getName(self):# 方法名首字母用小寫,其后每個(gè)單詞的首字母用大寫
??? return self.__name
??? if __name__ == "__main__":
??? student = Student("borphi")# 對(duì)象名用小寫字母
??? printstudent.getName()
??? 第1行代碼定義了一個(gè)名為Student的類,類名首字母大寫。
??? 第2行代碼定義了一個(gè)私有的實(shí)例變量,變量名前有兩個(gè)下劃線。
??? 第4行代碼使用self前綴說明__name變量屬于Student類。
??? 第5行代碼定義了一個(gè)公有的方法,方法名首字母小寫,其后的單詞“Name”首字母大寫。函數(shù)的命名規(guī)則與此相同。
??? 第9行代碼創(chuàng)建了一個(gè)student對(duì)象,對(duì)象名小寫。
??? 說明關(guān)于面向?qū)ο蟮木幊讨R(shí)將在第8章詳細(xì)介紹,讀者此時(shí)只要知道類、對(duì)象、屬性以及方法的書寫方式即可。
??? 3.函數(shù)名
??? 函數(shù)名通常采用小寫,并用下劃線或單詞首字母大寫來增加名稱的可讀性,導(dǎo)入的函數(shù)以模塊名作為前綴。為了演示導(dǎo)入函數(shù)前綴的寫法,下面使用了生成隨機(jī)數(shù)的模塊random。該模塊有一個(gè)函數(shù)randrange()。該函數(shù)可以根據(jù)給定的數(shù)字范圍生成隨機(jī)數(shù)。randrange()的聲明如下所示:
??? randrange(start, stop\[, step\])
??? 參數(shù)start表示生成隨機(jī)數(shù)所在范圍的開始數(shù)字。
??? 參數(shù)stop表示生成隨機(jī)數(shù)所在范圍的結(jié)束數(shù)字,但不包括數(shù)字stop。
??? 參數(shù)step表示從start開始往后的步數(shù)。生成的隨機(jī)數(shù)在\[start,stop - 1\]的范圍內(nèi),取值等于start + step。
??? 例如:
??? randrange(1, 9, 2)
??? 隨機(jī)數(shù)的范圍在1、3、5、7之間取得。
??? 【例2-3】演示函數(shù)的規(guī)范寫法,其中定義了一個(gè)函數(shù)compareNum(),該函數(shù)用于比較兩個(gè)數(shù)字的大小,并返回對(duì)應(yīng)的結(jié)果。
??? # 函數(shù)中的命名規(guī)則
??? import random
??? def compareNum(num1, num2):
??? if(num1 > num2):
??? return 1
??? elif(num1 == num2):
??? return 0
??? else:
??? return -1
??? num1 = random.randrange(1, 9)
??? num2 = random.randrange(1, 9)
??? print "num1 =", num1
??? print "num2 =", num2
??? print compareNum(num1, num2)
??? 第2行代碼導(dǎo)入了random模塊。
??? 第4行代碼定義了一個(gè)函數(shù)compareNum(),參數(shù)num1、num2為待比較的兩個(gè)變量。
??? 第5行到第10行代碼比較兩個(gè)數(shù)的大小,根據(jù)比較結(jié)果返回不同的結(jié)果。
??? 第11行、第12行代碼調(diào)用random模塊的randrange()返回兩個(gè)隨機(jī)數(shù)。
??? 第13行、第14行代碼輸出隨機(jī)數(shù),不同的機(jī)器、不同的執(zhí)行時(shí)間得到的隨機(jī)數(shù)均不相同。
??? 第15行代碼調(diào)用compareNum(),并把產(chǎn)生的兩個(gè)隨機(jī)數(shù)作為參數(shù)傳入。
??? 良好的命名習(xí)慣可以提高編程效率,使代碼閱讀者在不了解文檔的情況下,也能理解代碼的內(nèi)容。
??? 下面以變量的命名為例,說明如何定義有母實(shí)際含義的名稱。許多程序員對(duì)變量的命名帶有隨意性,如使用i、j、k等單個(gè)字母。代碼閱讀者并不知道這些變量的實(shí)際含義,需要閱讀文檔或仔細(xì)查看源代碼才能了解其含義。
??? 【例2-4】演示變量命名不規(guī)范的寫法。
??? # 不規(guī)范的變量命名寫法
??? sum = 0
??? i = 2000
??? j = 1200
??? sum = i + 12 * j
??? 這段代碼定義了一個(gè)求和變量sum,以及兩個(gè)變量i、j。如果只看代碼片段,并不知道該運(yùn)算的含義是什么,需要通讀整個(gè)函數(shù)或功能模塊才能理解此處各個(gè)變量的含義。
??? 【例2-5】演示符合命名規(guī)則的寫法。
??? # 規(guī)范的變量命名寫法
??? sumPay = 0
??? bonusOfYear = 2000
??? monthPay = 1200
??? sumPay = bonusOfYear + 12 * monthPay
??? bonusOfYear表示年終獎(jiǎng)金、monthPay表示月薪,因此sumPay表示全年的薪水。使變量的名字有實(shí)際含義可以節(jié)省閱讀程序的時(shí)間,能更快地理解程序的含義。
??? 注意變量的命名應(yīng)盡可能的表達(dá)此變量的作用,盡量避免使用縮寫,以便使任何人都能理解變量名的含義。不要過多的擔(dān)心變量名的長度,長的變量名往往能更表達(dá)清楚該變量的作用。
??? 以上討論的命名方式同樣適用于模塊名、類名、方法名、屬性名等。遵守命名規(guī)則會(huì)帶來很多好處。統(tǒng)一的命名規(guī)則便于程序開發(fā)團(tuán)隊(duì)合作開發(fā)同一個(gè)項(xiàng)目;便于統(tǒng)一代碼的風(fēng)格,理解不同程序員編寫的代碼;命名規(guī)范的變量名可以使程序代碼更容易被理解;避免項(xiàng)目中隨意命名變量的情況,促進(jìn)程序員之間的交流。規(guī)則并不是絕對(duì)的,統(tǒng)一規(guī)則、表達(dá)清楚名稱的含義才是制定規(guī)則的目的。