本章主要為大家介紹Python的一些語法疑苔,其中包括標識符、關(guān)鍵字甸鸟、常量惦费、變量、表達式抢韭、語句薪贫、注釋、模塊和包等內(nèi)容刻恭。
標識符和關(guān)鍵字
任何一種計算機語言都離不開標識符和關(guān)鍵字瞧省,因此下面將詳細介紹Python標識符和關(guān)鍵字。
標識符
標識符就是變量鳍贾、常量鞍匾、函數(shù)、屬性骑科、類橡淑、模塊和包等由程序員指定的名字。構(gòu)成標識符的字符均有一定的規(guī)范咆爽,Python語言中標識符的命名規(guī)則如下:
區(qū)分大小寫:Myname與myname是兩個不同的標識符梁棠。
首字符,可以是下劃線(_)或字母斗埂,但不能是數(shù)字符糊。
除首字符外其他字符,可以是下劃線(_)呛凶、字母和數(shù)字男娄。
關(guān)鍵字不能作為標識符。
不要使用Python內(nèi)置函數(shù)作為自己的標識符漾稀。
例如模闲,身高、identifier县好、userName围橡、User_Name、_sys_val等為合法的標識符缕贡,注意中文“身高”命名的變量是合法的翁授;而2mail、room#晾咪、$Name和class為非法的標識符收擦,注意#和$不能構(gòu)成標識符。
關(guān)鍵字
關(guān)鍵字是類似于標識符的保留字符序列谍倦,由語言本身定義好的塞赂,Python語言中有33關(guān)鍵字。只有三個昼蛀,即False宴猾、None和True首字母大寫圆存,其他的全部小寫。具體內(nèi)容見表4-1所示仇哆。
表 4?1 Python關(guān)鍵字
False | def | if | raise |
---|---|---|---|
None | del | import | return |
True | elif | in | try |
and | else | is | while |
as | except | lambda | with |
assert | finally | nonlocal | yield |
break | for | not | |
class | from | or | |
continue | global | pass |
變量和常量
上一章中介紹了如何使用編寫一個Python小程序沦辙,其中就用到了變量。常量和變量是構(gòu)成表達式的重要組成部分讹剔。
變量
在Python中聲明變量時不需要指定它的數(shù)據(jù)類型油讯,只要是給一個標識符賦值就聲明了變量延欠,示例代碼如下:
# 代碼文件:chapter4/src/ch4.2.1.kt
_hello = "HelloWorld" ①
score_for_student = 0.0 ②
y = 20 ③
y = True ④
代碼第①行、第②行和第③行分別聲明了三個變量由捎,這些變量聲明不需要指定數(shù)據(jù)類型,你賦給它什么數(shù)值隅俘,它就是該類型變量了邻奠。注意代碼第④行是給y變量賦布爾值True,雖然y已經(jīng)保存了整數(shù)類型20为居,但它也可以接收其他類型數(shù)據(jù)。
提示
Python是動態(tài)類型語言[1]蒙畴,它不會檢查數(shù)據(jù)類型,在變量聲明時不需要指定數(shù)據(jù)類型碑隆。這一點與Swift和Kotlin語言不同上煤,Swift和Kotlin雖然在聲明變量時也可以不指定數(shù)據(jù)類型,但是他們的編譯器會自動推導(dǎo)出該變量的數(shù)據(jù)類型独泞,一旦該變量確定了數(shù)據(jù)類型,就不能再接收其他類型數(shù)據(jù)了罚随,這一點與Python不同瓮栗。
常量
在很多語言中常量的定義是一旦初始化后就不能再被修改费奸。而Python不能從語法層面上定義常量,Python沒有提供一個關(guān)鍵字使得變量不能被修改以蕴。所以在Python中只能將變量當成常量使用魄缚,只是不要修改它习劫。那么這就帶來了一個安全隱患,可能會在無意中被修改,從而引發(fā)程序錯誤。解決此問題要么靠程序員自律和自查拒贱;要么通過一些技術(shù)手段使變量不能修改。
提示
Python作為解釋性動態(tài)語言苞氮,代碼安全很多情況下需要程序員自查的霸旗。而Java和C等靜態(tài)類型語言撵枢,這些問題會在編譯期檢查出來靴姿。
注釋
Python程序注釋使用井號(#)绽慈,使用時#位于注釋行的開頭谆沃,#后面有一個空格耕陷,接著是注釋內(nèi)容。
另外猾警,在第3章還介紹過文檔字符串,它也是一種注釋,只是用來注釋文檔的玄货,文檔注釋將在第5章詳細介紹。
使用注釋示例代碼如下:
# coding=utf-8 ①
# 代碼文件:chapter4/4.3/hello.py ②
# _hello = "HelloWorld" ③
# score_for_student = 0.0 ④
y = 20
y = "大家好"
print(y) # 打印y變量 ⑤
代碼①和②行#號是進行單號注釋也拜,#號也可連續(xù)注釋多行見代碼第③行~第④行永票,可以在一條語句的尾端進行注釋見代碼第⑤行世分。注意代碼①行#
coding=utf-8注釋作用很特殊是設(shè)置Python代碼文件的編碼集,該注釋語句必須放在文件的第一行或第二行才能有效。它還有替代寫法:
#!/usr/bin/python
# -*- coding: utf-8 -*-
其中#!/usr/bin/python注釋是在UNIX液斜、Liunx和macOS等平臺上安裝多個Python版本時检疫,具體指定哪個版本的Python解釋器。
提示
在PyCharm工具中對連續(xù)多行的注釋可以使用快捷鍵,具體步驟是:選擇多行然后按住“Ctrl+斜杠”組合鍵進行注釋。去掉注釋也是按住“Ctrl+斜杠”組合鍵焙矛。
注意
在程序代碼中,對容易引起誤解的代碼進行注釋是必要的,但應(yīng)避免對已清晰表達信息的代碼進行注釋。需要注意的是毅待,頻繁的注釋有時反映了代碼的低質(zhì)量刹泄。當覺得被迫要加注釋的時候,不妨考慮一下重寫代碼使其更清晰。
語句
Python代碼是由關(guān)鍵字、標識符、表達式和語句等內(nèi)容構(gòu)成符喝,語句是代碼的重要組成部分茉稠。
語句關(guān)注的代碼執(zhí)行過程把夸,如if、for和while等恋日。在Python語言中,一行代碼表示一條語句岂膳,語句結(jié)束可以加分號,也可以省略分號谈截。
示例代碼:
# coding=utf-8
# 代碼文件:chapter4/4.4/hello.py
_hello = "HelloWorld"
score_for_student = 0.0; # 沒有錯誤發(fā)生
y = 20
name1 = "Tom"; name2 = "Tony" ①
提示
從編程規(guī)范的角度講語句結(jié)束不需要加分號涧偷,而且每行至多包含一條語句毙死。代碼第①行的寫法是不規(guī)范的燎潮,推薦使用:
name1 = "Tom"
name2
Python還支持鏈式賦值語句扼倘,如果需要為多個變量賦相同的數(shù)值,可以這樣表示:
a = b = c = 10
這條語句是把整數(shù)10賦值給a唉锌、b、c三個變量袄简。
另外,在if绿语、for和while有代碼塊的語句中,代碼塊不是通過大括號來界定的吕粹,而是通過縮進,縮進在一個級別的代碼是在相同的代碼塊中匹耕。
# coding=utf-8
# 代碼文件:chapter4/4.4/hello.py
_hello = "HelloWorld"
score_for_student = 10.0; # 沒有錯誤發(fā)生
y = 20
name1 = "Tom"; name2 = "Tony"
# 鏈式賦值語句
a = b = c = 10
if y > 10:
print(y) ①
print(score_for_student) ②
else:
print(y * 10) ③
print(_hello) ④
代碼第①行和第②行是一個同一個縮進級別,他們是在相同的代碼塊中驶赏。而代碼第③行和第④行不是在同一個縮進級別中,他們是在不同的代碼塊中煤傍。
提示
一個縮進級別一般是一個制表符(Tab)或4個空格,考慮到不同的編輯器制表符顯示的寬度不同蚯姆,大部分編程語言規(guī)范推薦使用4個空格。
模塊
Python中一個模塊就是一個文件洒敏,模塊是保存代碼的最小單位,模塊中可以聲明變量桐玻、常量、函數(shù)镊靴、屬性和類等Python程序元素链韭。一個模塊提供可以訪問另外一個模塊中的程序元素。
下面通過示例介紹模塊的使用敞峭,現(xiàn)有兩個模塊:module1和hello。module1模塊代碼:
# coding=utf-8
# 代碼文件:chapter4/4.5/module1.py
y = True
z = 10.10
print('進入module1模塊')
hello模塊會訪問module1模塊的變量旋讹,hello模塊代碼:
# coding=utf-8
# 代碼文件:chapter4/4.5/hello.py
import module1 ①
from module1 import z ②
y = 20
print(y) # 訪問當前模塊變量y ③
print(module1.y) # 訪問module1模塊變量y ④
print(z) # 訪問module1模塊變量z ⑤
上述代碼hello模塊訪問module1模塊的變量y和z轿衔。為了實現(xiàn)這個目的沉迹,可以通過兩種import語句導(dǎo)入模塊module1中的代碼元素:
import
<模塊名>害驹。代碼第①行,這種方式會導(dǎo)入模塊所有代碼元素宛官,訪問時需要加“模塊名.”,見代碼第④行module1.y底洗,module1是模塊名,y是模塊module1中的變量亥揖。from <模塊名> import
<代碼元素>。代碼第②行费变,這種方式會只是導(dǎo)入特定的代碼元素,訪問時不需要加“模塊名.”胡控,見代碼第⑤行z變量旁趟,但是需要注意如果z變量在當前模塊中也有時,z不能導(dǎo)入锡搜,即z是當前模塊中的變量。
運行hello.py代碼輸出結(jié)果如下:
進入module1模塊
20
True
10.1
從運行結(jié)果可見import語句會運行導(dǎo)入的模塊耕餐,注意示例中使用了兩次import語句,但只執(zhí)行一次模塊內(nèi)容肠缔。
模塊事實上提供一種命名空間(namespace)[2]哼转。同一個模塊內(nèi)部不能有相同名字的代碼元素槽华,但是不同模塊可以,上述示例中的y命名的變量就是在兩個模塊中都有猫态。
包
如果兩個相同名字的模塊,任何防止命名沖突呢亲雪?那就是使用(package),很多語言都提供了包义辕,例如Java、Kotlin等终息,他們的作用都是一樣的提供一種命名空間。
創(chuàng)建包
重構(gòu)4.5節(jié)示例周崭,現(xiàn)有兩個模塊hello,他們放在不同的包com.pkg1和com.pkg2中续镇,如圖4-1所示,從圖中可見包是按照文件夾的層次結(jié)構(gòu)管理的摸航,而且每個包下面會有一個init.py文件,它告訴解釋器這個這是一個包酱虎,這個文件內(nèi)容一般情況下是空的,但可以編寫代碼聊记。
既然包是一個文件夾加上一個空的init.py文件恢暖,那么開發(fā)人員就可以自己在資源管理器中創(chuàng)建包排监。筆者推薦使用PyCharm工具中創(chuàng)建杰捂,它會創(chuàng)建文件夾的同時還會創(chuàng)建一個空的init.py文件。
具體步驟:使用PyCharm打開創(chuàng)建的項目,右擊項目選擇New → Python
Package菜單挨队,如圖4-2所示,在彈出對話框中輸入包名com.pkg瞒瘸,其中com是一個包,pkg是它的下一個層次的包省撑,中間用點(.)符號分隔。
包導(dǎo)入
包創(chuàng)建好后竟秫,將兩個模塊hello放到不同的包com.pkg1和com.pkg2中跷乐。由于
com.pkg1的hello模塊需要訪問com.pkg2的hello模塊中的元素肥败。那么任何導(dǎo)入呢愕提?事實上還是通過import語句,需要在模塊前面加上包名浅侨。
重構(gòu)4.5節(jié)示例,com.pkg2的hello模塊代碼:
# coding=utf-8
# 代碼文件:chapter4/4.5/com/pkg2/hello.py
y = True
z = 10.10
print('進入com.pkg2.hello模塊')
com.pkg1的hello模塊代碼:
# coding=utf-8
# 代碼文件:chapter4/4.5/com/pkg1/hello.py
import com.pkg2.hello as module1 ①
from com.pkg2.hello import z ②
y = 20
print(y) # 訪問當前模塊變量y
print(module1.y) # 訪問com.pkg2.hello模塊變量y ③
print(z) # 訪問com.pkg2.hello模塊變量z
代碼第①行是使用import語句com.pkg2.hello模塊所有代碼元素如输,由于com.pkg2.hello模塊名hello與當前模塊名沖突,因此需要as
module1語句為com.pkg2.hello模塊提供一個別名module1不见,訪問時需要使用module1.前綴。
代碼第②行是導(dǎo)入com.pkg2.hello模塊中z變量稳吮。from com.pkg2.hello import
z語句可以帶有別名,該語句修改為如下代碼:
from com.pkg2.hello import z as x
print(x) # 訪問com.pkg2.hello模塊變量z
使用別名的目的是防止發(fā)生命名沖突慎陵,也就是說要導(dǎo)入的z名字的變量在當前模塊總已經(jīng)存在了,所以給z一個別名x。
本章小結(jié)
本章主要介紹了Python語言中最基本的語法捏悬,首先介紹了標識符和關(guān)鍵字,讀者需要掌握標識符構(gòu)成过牙,了解Python關(guān)鍵字纺铭。然后介紹了Python中的變量、常量舶赔、注釋和語句谦秧。最后介紹了模塊和包竟纳,其中理解模塊和包的作用疚鲤,熟悉模塊和包導(dǎo)入方式。
配套視頻
http://www.zhijieketang.com/classroom/10/courses
配套源代碼
http://www.zhijieketang.com/group/8
紙質(zhì)版電商
京東:https://item.jd.com/12468732.html
當當:http://product.dangdang.com/25574315.html
作者微博:@tony_關(guān)東升
郵箱:eorient@sina.com
智捷課堂微信公共號:zhijieketang
Python讀者服務(wù)QQ群:565736812
-
動態(tài)類型語言會在運行期檢查變量或表達式數(shù)據(jù)類型集歇,主要有Python、PHP和Objective-C等诲宇。與動態(tài)語言對應(yīng)的還有靜態(tài)類型語言,靜態(tài)類型語言會在編譯期檢查變量或表達式數(shù)據(jù)類型姑蓝,如Java和C++等。 ?
-
命名空間它掂,也稱名字空間、名稱空間等虐秋,它表示著一個標識符(identifier)的可見范圍。一個標識符可在多個命名空間中定義用押,它在不同命名空間中的含義是互不相干的。這樣蜻拨,在一個新的命名空間中可定義任何標識符,他們不會與任何已有的標識符發(fā)生沖突缎讼,因為已有的定義都處于其他命名空間中。
——引自于 維基百科 https://zh.wikipedia.org/wiki/命名空間 ?