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