網(wǎng)站性能檢測評(píng)分
注:本網(wǎng)站頁面html檢測工具掃描網(wǎng)站中存在的基本問題,僅供參考。
python圓
Python實(shí)戰(zhàn)6:圖片右上角加數(shù)字,類似微信的未讀信息條數(shù)的效果 推廣視頻課程
運(yùn)行效果:
代碼的文本內(nèi)容:
from PIL import Image,ImageDraw,ImageFontim=Image.open(r'C:UsersAdministratorDesktopa.png') #打開一張圖片x=im.size; #獲取圖片的大小y=(x[0]-22,0); #獲取右上角紅色圓圈中字體的位置z=(x[0]-25,0,x[0],25) #獲取右上角紅色圓圈的位置,設(shè)置的圓的直徑為25draw=ImageDraw.Draw(im)draw.ellipse(z,fill='red',outline='red') #在圖片右上角畫圓font1=ImageFont.truetype("simsun.ttc",20,index=1) #設(shè)置字體樣式draw.text(y, '30', fill=(255, 255, 255),font=font1) #在圓內(nèi)寫入數(shù)字;im.show()
Python語言使用PyQt界面庫自定義圓形指示燈控件的方法 推廣視頻課程
背景
PyQt是Qt界面庫在Python下的綁定庫,為熟悉或喜歡Qt的開發(fā)者在Python語言下編寫GUI界面程序提供了極大的便利,關(guān)于自定義控件前面已經(jīng)給出了兩個(gè)例子,分別是自定義顏色指示框控件和自定義導(dǎo)航欄控件,這次給出一個(gè)在Python語言中使用PyQt庫自定義圓形指示燈控件的例子。
自定義圓形指示燈控件例子說明
先看一下調(diào)用該圓形指示燈控件時(shí)運(yùn)行界面的樣子,如下圖所示:
上圖中,左側(cè)部分包括了:設(shè)置圓形指示燈控件的各種屬性,如設(shè)置顏色、半徑等信息;恢復(fù)默認(rèn)屬性設(shè)置;啟動(dòng)/暫停跑馬燈效果等。右側(cè)上半部分是自定義的單個(gè)圓形指示燈控件,右側(cè)下半部分使用了八個(gè)指示燈控件,用以模擬跑馬燈的效果。該圓形指示燈控件具有如下特點(diǎn):
自適應(yīng)窗口大??;可單獨(dú)對(duì)各種屬性如顏色、半徑等進(jìn)行設(shè)置;對(duì)每個(gè)屬性提供了默認(rèn)值
代碼實(shí)現(xiàn)過程
根據(jù)上面的特點(diǎn),在PyQt中實(shí)現(xiàn)了一個(gè)基于QAbstractButton的圓形指示燈控件類——MyLed,下面逐步說明主要的代碼實(shí)現(xiàn)方法。
1、類初始化代碼
這部分主要設(shè)置圓形指示燈控件屬性的初始值,設(shè)置最小大小尺寸等,主要代碼如下圖所示:
這兒在類中定義了一個(gè)“_attributes”字典變量(可理解為私有變量),里面存儲(chǔ)了該控件的所有屬性及初始值,使用字典的update()函數(shù),將其更新到self.attributes成員變量中,這樣做的好處是可以隨時(shí)使用update()函數(shù)將控件的屬性恢復(fù)到默認(rèn)設(shè)置。
2、類方法(成員函數(shù))代碼
主要包括兩個(gè)函數(shù),“setLedDefaultOption”和“setLedOption”,前者將所有屬性設(shè)置為默認(rèn)值,后者設(shè)置單個(gè)屬性值,主要代碼如下圖所示:
需要說明的是,對(duì)控件屬性進(jìn)行修改后,要及時(shí)調(diào)用update()函數(shù),以強(qiáng)制使控件進(jìn)行外觀刷新。
3、重定義paintEvent事件
這是實(shí)現(xiàn)圓形指示燈控件外觀的主要代碼,定義了控件在不同狀態(tài)(真、假狀態(tài))、不同屬性值下的外觀,主要代碼如下圖所示:
這段代碼中有詳細(xì)的注釋,主要包括畫邊框外圈、邊框內(nèi)圈及畫內(nèi)圓等操作,為呈現(xiàn)立體感,簡單的使用了輻射漸變畫刷QRadialGradient類。
備注
調(diào)用上面的圓形指示燈控件類,將其放到主窗口中,即可看到本文開頭的運(yùn)行界面。測試代碼例子較長,難度不大,調(diào)用該類的成員函數(shù),可在界面上對(duì)各個(gè)屬性值分別進(jìn)行設(shè)置,大家可自行實(shí)現(xiàn)。
在模擬真實(shí)指示燈外觀方面,本例只是粗略的使用了輻射漸變畫刷,大家可以在paintEvent事件中修改相關(guān)代碼,實(shí)現(xiàn)更真實(shí)的外觀。另外,在這個(gè)例子的基礎(chǔ)上也可進(jìn)一步改進(jìn),如實(shí)現(xiàn)方形指示燈或其它形狀外觀的指示燈控件。
歡迎加關(guān)注,共同交流。
「Python大神請繞道,小白趕快進(jìn)」如何生成簡單的隨機(jī)數(shù)? 企業(yè)視頻課程
一、隨機(jī)數(shù)
隨機(jī)數(shù)是在一定范圍內(nèi)隨機(jī)產(chǎn)生的數(shù),并且得到這一范圍內(nèi)的每一個(gè)數(shù)的機(jī)會(huì)都一樣大。它在統(tǒng)計(jì)學(xué)、計(jì)算機(jī)仿真學(xué)以及密碼學(xué)中有著廣闊的應(yīng)用。
二、隨機(jī)數(shù)的生成
在Python中,通常使用random模塊生成隨機(jī)數(shù),它即可以生成簡單的隨機(jī)數(shù),還可以生成符合正態(tài)分布、三角分布等具有統(tǒng)計(jì)學(xué)規(guī)律的隨機(jī)數(shù)。但是該庫生成的隨機(jī)數(shù)并不是真正意義上的隨機(jī)數(shù),而是偽隨機(jī)數(shù),即通過可靠的算法算出一組固定的數(shù)據(jù),當(dāng)需要取值時(shí)則從這組數(shù)據(jù)中根據(jù)條件進(jìn)行取值,因此當(dāng)條件滿足時(shí),該方法產(chǎn)生的“隨機(jī)數(shù)”也可以是相同的。
下面我們就一起學(xué)習(xí)一下如何使用該模塊生成簡單隨機(jī)數(shù)吧!
1、隨機(jī)整數(shù)
random.randint(a, b)
該方法用于生成一個(gè)[a,b]區(qū)間內(nèi)的整數(shù)。
random.randrange(start, stop=None, step=1)
該方法用于從以step為步距的范圍為區(qū)間[start, stop)的等差數(shù)列中獲取一個(gè)隨機(jī)數(shù)。以start=1, stop=10, step=2為例,結(jié)果為從列表[1,3,5,7,9]中獲取一個(gè)隨機(jī)數(shù)。
注意,當(dāng)參數(shù)值stop缺失時(shí),返回值為區(qū)間[0,start)內(nèi)的隨機(jī)整數(shù),此時(shí)即使設(shè)置了step值也沒效果。
2、隨機(jī)浮點(diǎn)數(shù)
random.random()
該方法用于生成一個(gè)[0,1)區(qū)間內(nèi)的浮點(diǎn)數(shù)。
random.uniform(a, b)
該方法用于生成一個(gè)[a,b]或[b,a]區(qū)間內(nèi)的浮點(diǎn)數(shù)。
3、從序列中隨機(jī)選取元素
random.choice(seq)
該方法用于從序列seq中隨機(jī)選取一個(gè)元素。序列seq可以是元組、列表、字符串。
random.shuffle(x)
該方法用于將列表x打亂。
random.sample(population, k)
該方法用于從序列population中隨機(jī)選取k個(gè)元素組成一個(gè)新的列表。
4、生成相同的隨機(jī)數(shù)
文章一開始我們就介紹了random生成的隨機(jī)數(shù)是偽隨機(jī)數(shù),當(dāng)條件滿足時(shí),該方法產(chǎn)生的“隨機(jī)數(shù)”也可以是相同的。
這里我們說的條件滿足指的就是seed值,我們可以把它理解為從數(shù)據(jù)組取值的初始位置,該值通常不需要設(shè)置,系統(tǒng)會(huì)根據(jù)當(dāng)前時(shí)間自動(dòng)生成一個(gè),但是當(dāng)我們想要生成一個(gè)或者一組固定的隨機(jī)值時(shí),則需要通過random.seed(int)方法進(jìn)行設(shè)置。
Python使用PyQt界面庫繪制旋轉(zhuǎn)圓控件——修改版 推廣視頻課程
轉(zhuǎn)載自百家號(hào)作者:編碼那些事
Python是一種面向?qū)ο蟮母呒?jí)動(dòng)態(tài)編程語言,相對(duì)于其它如C/C++語言,具有上手快、代碼量少、開發(fā)效率高等特點(diǎn),Qt是跨平臺(tái)的C++圖形用戶界面應(yīng)用程序開發(fā)框架,是當(dāng)前主流的GUI開發(fā)工具之一,其在Python下的綁定是PyQt庫。使用“Python+PyQt”架構(gòu)編寫應(yīng)用軟件,可以做到在兼顧軟件運(yùn)行效率的前提下,也可以大大節(jié)省開發(fā)者的時(shí)間成本。
在上篇文章中給出了一個(gè)在Python語言中使用PyQt庫自定義不停旋轉(zhuǎn)的圓控件的例子,這次在這個(gè)例子的基礎(chǔ)上進(jìn)行修改,達(dá)到另外的旋轉(zhuǎn)外觀效果。
參考上篇文章:Python使用PyQt界面庫繪制不停旋轉(zhuǎn)的圓控件
控件例子說明
代碼實(shí)現(xiàn)后的控件運(yùn)行界面如下圖所示:
與上例不同的是,在不停旋轉(zhuǎn)的圓中,最外圈是藍(lán)綠相間的環(huán)形帶,最內(nèi)圈是灰綠色的背景圓圈。
代碼實(shí)現(xiàn)過程
在代碼實(shí)現(xiàn)中,除了重定義的paintEvent事件與上例不同外,其余的地方完全相同。paintEvent事件代碼如下圖所示:
與上例不同的地方在于:
1. 第37-40行,畫整個(gè)圓的顏色時(shí),修改顏色為灰綠色QColor(50, 80, 80),實(shí)際上在最終顯示效果中呈現(xiàn)的是內(nèi)圓的顏色
2. 第44行,定義每個(gè)扇形的旋轉(zhuǎn)跨度變量spanAngle為90時(shí),不需要乘以16,原因是這兒畫扇形時(shí)使用的函數(shù)是QPainterPath類的arcTo函數(shù),這是與上例使用QPainter類的drawPie函數(shù)的區(qū)別所在
3. 第46-55行,在畫4個(gè)扇形區(qū)域時(shí),其原理是,定義了兩個(gè)路徑path和subPath,分別在上面畫扇形區(qū)域和中間內(nèi)圓形區(qū)域,兩個(gè)區(qū)域的差就是最后呈現(xiàn)的效果,最外圈是藍(lán)綠相間的環(huán)形帶,最內(nèi)圈是灰綠色的背景圓圈圖,其中第52行,定義內(nèi)圓的所在的矩形區(qū)域時(shí),使用了QRect類的adjusted函數(shù),其目的是對(duì)pieRect矩形的大小進(jìn)行調(diào)整,以裁減掉中間的內(nèi)圓區(qū)域
備注
在PyQt中,通過自定義paintEvent事件,靈活使用PyQt中QPainterPath類和QPainter類的相關(guān)函數(shù),可以繪制出各種各樣的不同外觀效果的控件。
歡迎加關(guān)注,共同交流。
Python代碼風(fēng)格:PEP8規(guī)則 筆記 推廣視頻課程
Python程序設(shè)計(jì)的代碼風(fēng)格應(yīng)該遵循PEP8規(guī)則:
一、代碼布局
1、縮進(jìn):
每級(jí)縮進(jìn)4個(gè)空格(不用Tab,更不空格Tab混用)
1、續(xù)行應(yīng)該與其包裹元素對(duì)齊,要么使用圓括號(hào)、方括號(hào)和花括號(hào)內(nèi)的隱式行連接來垂直對(duì)齊,要么使用懸掛式縮進(jìn)對(duì)齊。當(dāng)使用懸掛縮進(jìn)時(shí),應(yīng)該考慮到第一行不應(yīng)該有參數(shù),以及使用縮進(jìn)以區(qū)分自己是續(xù)行。
2、縮進(jìn)4個(gè)空格的規(guī)則對(duì)于續(xù)行是可選的。
3、當(dāng) if 語句的條件部分長到需要換行寫的時(shí)候,注意可以在兩個(gè)字符關(guān)鍵字的連接處(比如 if ),增加一個(gè)空格,再增加一個(gè)左括號(hào)來創(chuàng)造一個(gè)4空格縮進(jìn)的多行條件。這會(huì)與 if 語句內(nèi)同樣使用4空格縮進(jìn)的代碼產(chǎn)生視覺沖突。PEP沒有明確指明要如何區(qū)分i發(fā)的條件代碼和內(nèi)嵌代碼??墒褂玫倪x項(xiàng)包括但不限于下面幾種情況:
4、(可以參考下面關(guān)于是否在二進(jìn)制運(yùn)算符之前或之后截?cái)嗟挠懻摚?/p>
在多行結(jié)構(gòu)中的大括號(hào)/中括號(hào)/小括號(hào)的右括號(hào)可以與內(nèi)容對(duì)齊單獨(dú)起一行作為最后一行的第一個(gè)字符,如:
或者也可以與多行結(jié)構(gòu)的第一行第一個(gè)字符對(duì)齊,如:
2、Tab還是空格?
空格是被首先推薦的縮進(jìn)方式。
Tab應(yīng)該只在現(xiàn)有代碼已經(jīng)使用tab進(jìn)行縮進(jìn)的情況下使用,以便和現(xiàn)有代碼保持一致。
Python 3不允許再同一個(gè)代碼塊中Tab和空格混合使用。
混合使用制表符和空格縮進(jìn)的Python2代碼應(yīng)該統(tǒng)一轉(zhuǎn)成空格。
使用命令行運(yùn)行Python 2時(shí),使用-t選項(xiàng),會(huì)出現(xiàn)非法混用tab和空格的警告。當(dāng)使用-tt選項(xiàng)時(shí),這些警告會(huì)變成錯(cuò)誤。強(qiáng)烈推薦使用這些選項(xiàng)!
3、最大行長
每行最大長度79個(gè)字符。
對(duì)于連續(xù)大段的文字(比如文檔字符串(docstring)或注釋),每行應(yīng)該被限制在72個(gè)字符長度內(nèi)。
Python標(biāo)準(zhǔn)庫比較傳統(tǒng),將行長限制在79個(gè)字符以內(nèi)(文檔字符串/注釋為72個(gè)字符)。
一種推薦的換行方式是利用Python圓括號(hào)、方括號(hào)和花括號(hào)中的隱式續(xù)行。長行可以通過在括號(hào)內(nèi)換行來分成多行。應(yīng)該最好加上反斜杠來區(qū)別續(xù)行。
有時(shí)續(xù)行只能使用反斜杠才。例如,較長的多個(gè) with 語句不能采用隱式續(xù)行,只能接受反斜杠表示換行:
另一個(gè)這樣的例子是assert語句。要確保續(xù)行的縮進(jìn)適當(dāng)。
在二元運(yùn)算符之前應(yīng)該換行嗎?
遵循數(shù)學(xué)的傳統(tǒng)能產(chǎn)出更多可讀性高的代碼:
4、空行
頂層函數(shù)和類的定義,前后用兩個(gè)空行隔開。
類里的方法定義用一個(gè)空行隔開。
相關(guān)的功能組可以用額外的空行(盡量少地)隔開。一堆相關(guān)的單行代碼之間的空白行可以省略(例如,一組虛擬實(shí)現(xiàn) dummy implementations)。
在函數(shù)中使用空行來區(qū)分邏輯段(盡量少地)。
Python接受control-L(即^L)換頁符作為空格;許多工具把這些字符當(dāng)作頁面分隔符,所以你可以在文件中使用它們來分隔相關(guān)段落。請注意,一些編輯器和基于Web的代碼閱讀器可能無法識(shí)別control-L為換頁,將在其位置顯示另一個(gè)字形。
5、源文件編碼
Python核心發(fā)布版本中的代碼總是以UTF-8格式編碼(或者在Python2中用ASCII編碼)。
使用ASCII(Python 2)或者UTF-8(Python 3)的文件不應(yīng)該添加編碼聲明。
在標(biāo)準(zhǔn)庫中,只有用作測試目的,或者注釋或文檔字符串需要提及作者名字而不得不使用非ASCII字符時(shí),才能使用非默認(rèn)的編碼。否則,在字符串文字中包括非ASCII數(shù)據(jù)時(shí),推薦使用\x, \u, U或N等轉(zhuǎn)義符。
對(duì)于Python 3.0及其以后的版本中,標(biāo)準(zhǔn)庫遵循以下原則(參見PEP 3131):Python標(biāo)準(zhǔn)庫中的所有標(biāo)識(shí)符都必須只采用ASCII編碼的標(biāo)識(shí)符,在可行的條件下也應(yīng)當(dāng)使用英文詞(很多情況下,使用的縮寫和技術(shù)術(shù)語詞都不是英文)。此外,字符串文字和注釋應(yīng)該只包括ASCII編碼。只有兩種例外:
(a) 測試情況下為了測試非ASCII編碼的特性
(b) 作者名字。作者名字不是由拉丁字母組成的也必須提供一個(gè)拉丁音譯名。
鼓勵(lì)面向全球的開源項(xiàng)目都采用類似的原則。
6、導(dǎo)入
1、imports應(yīng)該分行寫,而不是都寫在一行,例如:
這樣寫也是可以的:
導(dǎo)入(import)始終在文件的頂部,在模塊注釋和文檔字符串之后,在模塊全局變量和常量之前。
導(dǎo)入順序如下:
imports應(yīng)該按照下面的順序分組來寫:
1、標(biāo)準(zhǔn)庫imports
2、相關(guān)第三方imports
3、本地應(yīng)用/庫的特定imports
不同組的imports之前用空格隔開。
將任何相關(guān)的 __all__ 說明(specification)放在imports之后。
推薦使用絕對(duì)(absolute)imports,因?yàn)檫@樣通常更易讀,在import系統(tǒng)沒有正確配置的情況下,也會(huì)有更好的表現(xiàn)(或者至少會(huì)給出錯(cuò)誤信息):
在絕對(duì)路徑比較長的情況下,也可以使用相對(duì)導(dǎo)入:
Python 3中已經(jīng)禁止隱式的相對(duì)導(dǎo)入。
導(dǎo)入類的方法,通常可以這樣寫:
如果和本地命名的拼寫產(chǎn)生了沖突,應(yīng)當(dāng)使用絕對(duì)導(dǎo)入:
禁止使用通配符導(dǎo)入。
通配符導(dǎo)入(from import *)應(yīng)該避免,因?yàn)樗磺宄臻g有哪些名稱存,混淆讀者和許多自動(dòng)化的工具。唯一的例外是重新發(fā)布對(duì)外的API時(shí)可以考慮使用。
7、模塊中前后具有雙下劃線的變量名
像__all__ , __author__ , __version__ 等這樣的模塊中的變量名(也就是名字里有兩個(gè)前綴下劃線和兩個(gè)后綴下劃線),應(yīng)該放在文檔字符串的后面,以及除from __future__ 之外的import表達(dá)式前面。Python要求將來在模塊中的導(dǎo)入,必須出現(xiàn)在除文檔字符串之外的其他代碼之前。
比如:
二、字符串引號(hào)
Python中單引號(hào)字符串和雙引號(hào)字符串都是相同的。注意盡量避免在字符串中的反斜杠以提高可讀性。
根據(jù)PEP 257, 三個(gè)引號(hào)都使用雙引號(hào)。
三、表達(dá)式和語句中的空格
在下列情況下,避免使用無關(guān)的空格:
1、緊跟在小括號(hào),中括號(hào)或者大括號(hào)后。
2、緊貼在逗號(hào)、分號(hào)或者冒號(hào)之前。
3、然而,冒號(hào)在切片中就像二元運(yùn)算符,在兩邊應(yīng)該有相同數(shù)量的空格(把它當(dāng)做優(yōu)先級(jí)最低的操作符)。在擴(kuò)展的切片操作中,所有的冒號(hào)必須有相同的間距。例外情況:當(dāng)一個(gè)切片參數(shù)被省略時(shí),空格就被省略了。
4、緊貼在函數(shù)參數(shù)的左括號(hào)之前。
5、緊貼索引或者切片的左括號(hào)之前。
6、為了和另一個(gè)賦值語句對(duì)齊,在賦值運(yùn)算符附件加多個(gè)空格。
其他建議
1、避免在尾部添加空格。因?yàn)槲膊康目崭裢ǔ6伎床灰?,?huì)產(chǎn)生混亂:比如,一個(gè)反斜杠后面跟一個(gè)空格的換行符,不算續(xù)行標(biāo)記。有些編輯器不會(huì)保留尾空格,并且很多項(xiàng)目(像CPython)在pre-commit的掛鉤調(diào)用中會(huì)過濾掉尾空格。
總是在二元運(yùn)算符兩邊加一個(gè)空格:賦值(=),增量賦值(+=,-=),比較(==,,!=,,=,in,not,in,is,is not),布爾(and, or, not)。
如果使用具有不同優(yōu)先級(jí)的運(yùn)算符,請考慮在具有最低優(yōu)先級(jí)的運(yùn)算符周圍添加空格。有時(shí)需要通過自己來判斷;但是,不要使用一個(gè)以上的空格,并且在二元運(yùn)算符的兩邊使用相同數(shù)量的空格。
2、在指定函數(shù) 關(guān)鍵字參數(shù) 或者 默認(rèn)參數(shù) 值的時(shí)候,不要在=附近加上空格。
3、功能型注釋應(yīng)該使用冒號(hào)的一般性規(guī)則,并且在使用 ->的時(shí)候要在兩邊加空格。(參考下面的功能注釋得到能夠多信息)
4、當(dāng)給有類型備注的參數(shù)賦值的時(shí)候,在=兩邊添加空格(僅針對(duì)那種有類型備注和默認(rèn)值的參數(shù))。
5、復(fù)合語句(同一行中的多個(gè)語句)通常是不允許的。
6、雖然有時(shí)候?qū)⑿〉拇a塊和 if/for/while 放在同一行沒什么問題,多行語句塊的情況不要這樣用,同樣也要避免代碼行太長!
四、注釋
與代碼自相矛盾的注釋比沒注釋更差。修改代碼時(shí)要優(yōu)先更新注釋!
注釋是完整的句子。如果注釋是斷句,首字母應(yīng)該大寫,除非它是小寫字母開頭的標(biāo)識(shí)符(永遠(yuǎn)不要修改標(biāo)識(shí)符的大小寫)。
如果注釋很短,可以省略末尾的句號(hào)。注釋塊通常由一個(gè)或多個(gè)段落組成。段落由完整的句子構(gòu)成且每個(gè)句子應(yīng)該以點(diǎn)號(hào)(后面要有兩個(gè)空格)結(jié)束,并注意斷詞和空格。
非英語國家的程序員請用英語書寫你的注釋,除非你120%確信代碼永遠(yuǎn)不會(huì)被不懂你的語言的人閱讀。
1、注釋塊
注釋塊通常應(yīng)用在代碼前,并和這些代碼有同樣的縮進(jìn)。每行以 '# '(除非它是注釋內(nèi)的縮進(jìn)文本,注意#后面有空格)。
注釋塊內(nèi)的段落用僅包含單個(gè) '#' 的行分割。
2、行內(nèi)注釋
慎用行內(nèi)注釋(Inline Comments) 節(jié)儉使用行內(nèi)注釋。 行內(nèi)注釋是和語句在同一行,至少用兩個(gè)空格和語句分開。行內(nèi)注釋不是必需的,重復(fù)羅嗦會(huì)使人分心。
不推薦:
但是有時(shí),很有必要:
加了以后對(duì)理解代碼很有幫助的情況下,關(guān)鍵處才加。
3、文檔字符串
文檔字符串的標(biāo)準(zhǔn)參見:PEP 257。
為所有公共模塊、函數(shù)、類和方法書寫文檔字符串。非公開方法不一定有文檔字符串,建議有注釋(出現(xiàn)在 def 行之后)來描述這個(gè)方法做什么。
更多參考:PEP 257 文檔字符串約定。注意結(jié)尾的 """ 應(yīng)該單獨(dú)成行,例如:
單行的文檔字符串,結(jié)尾的 """ 在同一行。
4、版本標(biāo)簽
如果你必須在源文件中包含git、Subversion、CVS或RCS crud信息,放置在模塊的文檔字符串之后,任何其他代碼之前,上下各用一個(gè)空行:
五、命名規(guī)范
Python庫的命名約定有點(diǎn)混亂,不可能完全一致。但依然有些普遍推薦的命名規(guī)范的。新的模塊和包 (包括第三方的框架) 應(yīng)該遵循這些標(biāo)準(zhǔn)。對(duì)不同風(fēng)格的已有的庫,建議保持內(nèi)部的一致性。
1、最重要的原則
用戶可見的API命名應(yīng)遵循使用約定而不是實(shí)現(xiàn)。
2、命名風(fēng)格
以下是常見的命名方式:
b(單個(gè)小寫字母)
B(單個(gè)大寫字母)
lowercase (小寫字母)
lower_case_with_underscores (使用下劃線分隔的小寫字母)
UPPERCASE( 大寫字母)
UPPER_CASE_WITH_UNDERSCORES (使用下劃線分隔的大寫字母)
CapitalizedWords(首字母大寫的單詞串或駝峰縮寫)
注意: 使用大寫縮寫時(shí),縮寫使用大寫字母更好。故 HTTPServerError 比 HttpServerError 更好。
mixedCase(不同于首字母大寫,第一個(gè)單詞的首字母小寫)
Capitalized_Words_With_Underscores(帶下劃線,首字母大寫,巨丑無比)
還有一種風(fēng)格使用短前綴分組名字。這在Python中不常用, 但出于完整性提一下。例如,os.stat()返回的元組有st_mode, st_size, st_mtime等等這樣的名字(與POSIX系統(tǒng)調(diào)用結(jié)構(gòu)體一致)。
X11庫的所有公開函數(shù)以X開頭, Python中通常認(rèn)為是不必要的,因?yàn)閷傩院头椒袑?duì)象作前綴,而函數(shù)名有模塊名為前綴。
下面講述首尾有下劃線的情況:
_single_leading_underscore:(單前置下劃線): 弱內(nèi)部使用標(biāo)志。 例如"from M import " 不會(huì)導(dǎo)入以下劃線開頭的對(duì)象。
single_trailing_underscore_(單后置下劃線): 用于避免與 Python關(guān)鍵詞的沖突。 例如:
__double_leading_underscore(雙前置下劃線): 當(dāng)用于命名類屬性,會(huì)觸發(fā)名字重整。 (在類FooBar中,__boo變成 _FooBar__boo)。
__double_leading_and_trailing_underscore__(雙前后下劃線):用戶名字空間的魔法對(duì)象或?qū)傩?。例?__init__ , __import__ or __file__,不要自己發(fā)明這樣的名字。
3、命名約定規(guī)范
避免采用的名字:
決不要用字符'l'(小寫字母el),'O'(大寫字母oh),或 'I'(大寫字母eye) 作為單個(gè)字符的變量名。一些字體中,這些字符不能與數(shù)字1和0區(qū)別。用'L' 代替'l'時(shí)。
包和模塊名:
模塊名要簡短,全部用小寫字母,可使用下劃線以提高可讀性。包名和模塊名類似,但不推薦使用下劃線。
模塊名對(duì)應(yīng)到文件名,有些文件系統(tǒng)不區(qū)分大小寫且截短長名字,在 Unix上不是問題,但當(dāng)把代碼遷移到 Mac、Windows 或 DOS 上時(shí),就可能是個(gè)問題。當(dāng)然隨著系統(tǒng)的演進(jìn),這個(gè)問題已經(jīng)不是經(jīng)常出現(xiàn)。
另外有些模塊底層用C或C++ 書寫,并有對(duì)應(yīng)的高層Python模塊,C/C++模塊名有一個(gè)前置下劃線 (如:_socket)。
類名:
遵循CapWord。
接口需要文檔化并且可以調(diào)用時(shí),可能使用函數(shù)的命名規(guī)則。
注意大部分內(nèi)置的名字是單個(gè)單詞(或兩個(gè)),CapWord只適用于異常名稱和內(nèi)置的常量。
異常名:
如果確實(shí)是錯(cuò)誤,需要在類名添加后綴 "Error"。
全局變量名:
變量盡量只用于模塊內(nèi)部,約定類似函數(shù)。
對(duì)設(shè)計(jì)為通過 "from M import " 來使用的模塊,應(yīng)采用 __all__ 機(jī)制來防止導(dǎo)入全局變量;或者為全局變量加一個(gè)前置下劃線。
函數(shù)名:
函數(shù)名應(yīng)該為小寫,必要時(shí)可用下劃線分隔單詞以增加可讀性。 mixedCase(混合大小寫)僅被允許用于兼容性考慮(如: threading.py)。
函數(shù)和方法的參數(shù):
實(shí)例方法第一個(gè)參數(shù)是 'self'。
類方法第一個(gè)參數(shù)是 'cls'。
如果函數(shù)的參數(shù)名與保留關(guān)鍵字沖突,通常在參數(shù)名后加一個(gè)下劃線。
方法名和實(shí)例變量:
同函數(shù)命名規(guī)則。
非公開方法和實(shí)例變量增加一個(gè)前置下劃線。
為避免與子類命名沖突,采用兩個(gè)前置下劃線來觸發(fā)重整。類Foo屬性名為__a, 不能以 Foo.__a訪問。(執(zhí)著的用戶還是可以通過Foo._Foo__a。) 通常雙前置下劃線僅被用來避免與基類的屬性發(fā)生命名沖突。
常量:
<...