1.Python注釋
單行注釋 #作為單行注釋的符號(hào),語(yǔ)法格式為:
# 注釋內(nèi)容
從井號(hào)#開始,直到這行結(jié)束為止的所有內(nèi)容都是注釋。Python 解釋器遇到#時(shí),會(huì)忽略它后面的整行內(nèi)容。
#使用print輸出字符串
print("Hello World!")
#使用 print輸出數(shù)字
print(100)
多行注釋 使用三個(gè)連續(xù)的單引號(hào)'''或者三個(gè)連續(xù)的雙引號(hào)"""注釋多行內(nèi)容,具體格式如下:
'''
使用 3 個(gè)單引號(hào)分別作為注釋的開頭和結(jié)尾
可以一次性注釋多行內(nèi)容
這里面的內(nèi)容全部是注釋內(nèi)容
'''
多行注釋通常用來(lái)為 Python 文件、模塊、類或者函數(shù)等添加版權(quán)或者功能描述信息。
注意事項(xiàng)
- Python 多行注釋不支持嵌套
- 不管是多行注釋還是單行注釋,當(dāng)注釋符作為字符串的一部分出現(xiàn)時(shí),就不能再將它們視為注釋標(biāo)記,而應(yīng)該看做正常代碼的一部分
2.Python縮進(jìn)規(guī)則
Python 中實(shí)現(xiàn)對(duì)代碼的縮進(jìn),可以使用空格或者 Tab 鍵實(shí)現(xiàn)。
但無(wú)論是手動(dòng)敲空格,還是使用 Tab 鍵,通常情況下都是采用 4 個(gè)空格長(zhǎng)度作為一個(gè)縮進(jìn)量
height=float(input("輸入身高:")) #輸入身高
weight=float(input("輸入體重:")) #輸入體重
bmi=weight/(height*height) #計(jì)算BMI指數(shù)
#判斷身材是否合理
if bmi<18.5:
#下面 2 行同屬于 if 分支語(yǔ)句中包含的代碼
#因此屬于同一作用域
print("BMI指數(shù)為:"+str(bmi)) #輸出BMI指數(shù)
print("體重過(guò)輕")
if bmi>=18.5 and bmi<24.9:
print("BMI指數(shù)為:"+str(bmi)) #輸出BMI指數(shù)
print("正常范圍,注意保持")
if bmi>=24.9 and bmi<29.9:
print("BMI指數(shù)為:"+str(bmi)) #輸出BMI指數(shù)
print("體重過(guò)重")
if bmi>=29.9:
print(BMI指數(shù)為:"+str(bmi)) #輸出BMI指數(shù)
print("肥胖")
Python 對(duì)代碼的縮進(jìn)要求非常嚴(yán)格,同一個(gè)級(jí)別代碼塊的縮進(jìn)量必須一樣,否則解釋器會(huì)報(bào) SyntaxError 異常錯(cuò)誤。
3.PEP8 Python 編碼規(guī)范整理
一 代碼編排
1 縮進(jìn):4個(gè)空格的縮進(jìn)(編輯器都可以完成此功能),不使用TAB,更不能混合使用TAB和空格
2 每行最大長(zhǎng)度79,換行可以使用反斜杠,最好使用圓括號(hào)。換行點(diǎn)要在操作符的后邊敲回車
3 類和top-level函數(shù)定義之間空兩行;類中的方法定義之間空一行;函數(shù)內(nèi)邏輯無(wú)關(guān)段落之間空一行;其他地方盡量不要再空行。
二 文檔編排
1 模塊內(nèi)容的順序:模塊說(shuō)明和docstring—import—globals&constants—其他定義。其中import部分,又按標(biāo)準(zhǔn)、三方和自己編寫順序依次排放,之間空一行
2 不要在一句import中多個(gè)庫(kù),比如import os, sys不推薦。
3 如果采用from XX import XX引用庫(kù),可以省略‘module.’,都是可能出現(xiàn)命名沖突,這時(shí)就要采用import XX。
三 空格的使用
總體原則,避免不必要的空格。
1 各種右括號(hào)前不要加空格。
2 逗號(hào)、冒號(hào)、分號(hào)前不要加空格
3 函數(shù)的左括號(hào)前不要加空格。如Func(1)
4 序列的左括號(hào)前不要加空格。如list[2]。
5 操作符左右各加一個(gè)空格,不要為了對(duì)齊增加空格。
6 函數(shù)默認(rèn)參數(shù)使用的賦值符左右省略空格。
7 不要將多句語(yǔ)句寫在同一行,盡管使用‘;’允許。
8 if/for/while語(yǔ)句中,即使執(zhí)行語(yǔ)句只有一句,也必須另起一行。
四 注釋
總體原則,錯(cuò)誤的注釋不如沒有注釋。所以當(dāng)一段代碼發(fā)生變化時(shí),第一件事就是要修改注釋!
注釋必須使用英文,最好是完整的句子,首字母大寫,句后要有結(jié)束符,結(jié)束符后跟兩個(gè)空格,開始下一句。如果是短語(yǔ),可以省略結(jié)束符。
1 塊注釋,在一段代碼前增加的注釋。在‘#’后加一空格。段落之間以只有‘#’的行間隔。比如:
Description : Module config.
# Input : None
# Output : None
2 行注釋,在一句代碼后加注釋。比如:x = x + 1 #注這是一條注釋
但是這種方式盡量少使用。
3 避免無(wú)謂的注釋。
五 文檔描述
1 為所有的共有模塊、函數(shù)、類、方法寫docstrings;非共有的沒有必要,但是可以寫注釋(在def的下一行)。
2 如果docstring要換行,參考如下例子,詳見PEP 257"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
六 命名規(guī)范
總體原則,新編代碼必須按下面命名風(fēng)格進(jìn)行,現(xiàn)有庫(kù)的編碼盡量保持風(fēng)格。
1 盡量單獨(dú)使用小寫字母‘l’,大寫字母‘O’等容易混淆的字母。
2 模塊命名盡量短小,使用全部小寫的方式,可以使用下劃線。
3 包命名盡量短小,使用全部小寫的方式,不可以使用下劃線。
4 類的命名使用CapWords的方式,模塊內(nèi)部使用的類采用_CapWords的方式。
5 異常命名使用CapWords+Error后綴的方式。
6 全局變量盡量只在模塊內(nèi)有效,類似C語(yǔ)言中的static。實(shí)現(xiàn)方法有兩種,一是all機(jī)制;二是前綴一個(gè)下劃線。
7 函數(shù)命名使用全部小寫的方式,可以使用下劃線。
8 常量命名使用全部大寫的方式,可以使用下劃線。
9 類的屬性(方法和變量)命名使用全部小寫的方式,可以使用下劃線。
10 類的屬性有3種作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public屬性前,前綴一條下劃線。
11 類的屬性若與關(guān)鍵字名字沖突,后綴一下劃線,盡量不要使用縮略等其他方式。
12 為避免與子類屬性命名沖突,在類的一些屬性前,前綴兩條下劃線。比如:類Foo中聲明__a,訪問(wèn)時(shí),只能通過(guò)Foo._Foo__a,避免歧義。如果子類也叫Foo,那就無(wú)能為力了。
13 類的方法第一個(gè)參數(shù)必須是self,而靜態(tài)方法第一個(gè)參數(shù)必須是cls。
七 編碼建議
1 編碼中考慮到其他python實(shí)現(xiàn)的效率等問(wèn)題,比如運(yùn)算符‘+’在CPython(Python)中效率很高,都是Jython中卻非常低,所以應(yīng)該采用.join()的方式。
2 盡可能使用 ‘is’ ‘is not’取代‘==’,比如if x is not None 要優(yōu)于if x。
3 使用基于類的異常,每個(gè)模塊或包都有自己的異常類,此異常類繼承自Exception。
4 異常中不要使用裸露的except,except后跟具體的exceptions。
5 異常中try的代碼盡可能少。比如:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
要優(yōu)于
try:
\# Too broad!
return handle_value(collection[key])
except KeyError:
\# Will also catch KeyError raised by handle_value()
return key_not_found(key)
6 使用
startswith()和endswith()代替切片進(jìn)行序列前綴或后綴的檢查。比如
Yes: if foo.startswith(‘bar’)優(yōu)于No: if foo[:3] == ‘bar’
7 使用isinstance()比較對(duì)象的類型。比如
Yes: if isinstance(obj, int)優(yōu)于No: if type(obj) is type(1)
8 判斷序列空或不空,有如下規(guī)則
Yes: if not seq:
if seq:
優(yōu)于
No: if len(seq)
if not len(seq)
9 字符串不要以空格收尾。
10 二進(jìn)制數(shù)據(jù)判斷使用 if boolvalue的方式
4.Python標(biāo)識(shí)符命名規(guī)范
Python標(biāo)識(shí)符命名規(guī)則:
- 標(biāo)識(shí)符是由字符(A~Z 和 a~z)、下劃線和數(shù)字組成,但第一個(gè)字符不能是數(shù)字。
- 標(biāo)識(shí)符不能和 Python 中的保留字相同。有關(guān)保留字,后續(xù)章節(jié)會(huì)詳細(xì)介紹。
- Python中的標(biāo)識(shí)符中,不能包含空格、@、% 以及 $ 等特殊字符。
- 在 Python 中,標(biāo)識(shí)符中的字母是嚴(yán)格區(qū)分大小寫的
- Python 語(yǔ)言中,以下劃線開頭的標(biāo)識(shí)符有特殊含義,例如:
- 以單下劃線開頭的標(biāo)識(shí)符(如 _width),表示不能直接訪問(wèn)的類屬性,其無(wú)法通過(guò) from...import* 的方式導(dǎo)入;
- 以雙下劃線開頭的標(biāo)識(shí)符(如__add)表示類的私有成員;
- 以雙下劃線作為開頭和結(jié)尾的標(biāo)識(shí)符(如 __init__),是專用標(biāo)識(shí)符。
因此,除非特定場(chǎng)景需要,應(yīng)避免使用以下劃線開頭的標(biāo)識(shí)符。
標(biāo)識(shí)符的命名,除了要遵守以上這幾條規(guī)則外,不同場(chǎng)景中的標(biāo)識(shí)符,其名稱也有一定的規(guī)范可循,例如:
- 當(dāng)標(biāo)識(shí)符用作模塊名時(shí),應(yīng)盡量短小,并且全部使用小寫字母,可以使用下劃線分割多個(gè)字母,例如 game_mian、game_register 等。
- 當(dāng)標(biāo)識(shí)符用作包的名稱時(shí),應(yīng)盡量短小,也全部使用小寫字母,不推薦使用下劃線,例如 com.mr、com.mr.book 等。
- 當(dāng)標(biāo)識(shí)符用作類名時(shí),應(yīng)采用單詞首字母大寫的形式。例如,定義一個(gè)圖書類,可以命名為 Book。
- 模塊內(nèi)部的類名,可以采用 "下劃線+首字母大寫" 的形式,如 _Book;
- 函數(shù)名、類中的屬性名和方法名,應(yīng)全部使用小寫字母,多個(gè)單詞之間可以用下劃線分割;
常量命名應(yīng)全部使用大寫字母,單詞之間可以用下劃線分割
5.Python關(guān)鍵字
保留字是 Python語(yǔ)言中一些已經(jīng)被賦予特定意義的單詞,這就要求開發(fā)者在開發(fā)程序時(shí),不能用這些保留字作為標(biāo)識(shí)符給變量、函數(shù)、類、模板以及其他對(duì)象命名。
(base) leesin@LeeSin-Deepin:~$ python
Python 3.7.6 (default, Jan 8 2020, 19:59:22)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break',
'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for',
'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not',
'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

6.Python內(nèi)置函數(shù)
Python 解釋器也是一個(gè)程序,它給用戶提供了一些常用功能,并給它們起了獨(dú)一無(wú)二的名字,這些常用功能就是內(nèi)置函數(shù)。Python 解釋器啟動(dòng)以后,內(nèi)置函數(shù)也生效了,可以直接拿來(lái)使用。
Python 標(biāo)準(zhǔn)庫(kù)相當(dāng)于解釋器的外部擴(kuò)展,它并不會(huì)隨著解釋器的啟動(dòng)而啟動(dòng),要想使用這些外部擴(kuò)展,必須提前導(dǎo)入。Python 標(biāo)準(zhǔn)庫(kù)非常龐大,包含了很多模塊,要想使用某個(gè)函數(shù),必須提前導(dǎo)入對(duì)應(yīng)的模塊,否則函數(shù)是無(wú)效的。
內(nèi)置函數(shù)是解釋器的一部分,它隨著解釋器的啟動(dòng)而生效;標(biāo)準(zhǔn)庫(kù)函數(shù)是解釋器的外部擴(kuò)展,導(dǎo)入模塊以后才能生效。一般來(lái)說(shuō),內(nèi)置函數(shù)的執(zhí)行效率要高于標(biāo)準(zhǔn)庫(kù)函數(shù)。

注意:
不要使用內(nèi)置函數(shù)的名字作為標(biāo)識(shí)符使用(例如變量名、函數(shù)名、類名、模板名、對(duì)象名等)
雖然這樣做 Python 解釋器不會(huì)報(bào)錯(cuò),但這會(huì)導(dǎo)致同名的內(nèi)置函數(shù)被覆蓋,從而無(wú)法使用