《Python從小白到大判》第4章 Python語法基礎(chǔ)

《Python從小白到大疟考Γ》已經(jīng)上市!

本章主要為大家介紹Python的一些語法疑苔,其中包括標識符、關(guān)鍵字甸鸟、常量惦费、變量、表達式抢韭、語句薪贫、注釋、模塊和包等內(nèi)容刻恭。

標識符和關(guān)鍵字

任何一種計算機語言都離不開標識符和關(guān)鍵字瞧省,因此下面將詳細介紹Python標識符和關(guān)鍵字。

標識符

標識符就是變量鳍贾、常量鞍匾、函數(shù)、屬性骑科、類橡淑、模塊和包等由程序員指定的名字。構(gòu)成標識符的字符均有一定的規(guī)范咆爽,Python語言中標識符的命名規(guī)則如下:

  1. 區(qū)分大小寫:Myname與myname是兩個不同的標識符梁棠。

  2. 首字符,可以是下劃線(_)或字母斗埂,但不能是數(shù)字符糊。

  3. 除首字符外其他字符,可以是下劃線(_)呛凶、字母和數(shù)字男娄。

  4. 關(guān)鍵字不能作為標識符。

  5. 不要使用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)容一般情況下是空的,但可以編寫代碼聊记。

圖4-1 包層次

既然包是一個文件夾加上一個空的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是它的下一個層次的包省撑,中間用點(.)符號分隔。

圖4-2 PyCharm項目中創(chuàng)建包

包導(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


  1. 動態(tài)類型語言會在運行期檢查變量或表達式數(shù)據(jù)類型集歇,主要有Python、PHP和Objective-C等诲宇。與動態(tài)語言對應(yīng)的還有靜態(tài)類型語言,靜態(tài)類型語言會在編譯期檢查變量或表達式數(shù)據(jù)類型姑蓝,如Java和C++等。 ?

  2. 命名空間它掂,也稱名字空間、名稱空間等虐秋,它表示著一個標識符(identifier)的可見范圍。一個標識符可在多個命名空間中定義用押,它在不同命名空間中的含義是互不相干的。這樣蜻拨,在一個新的命名空間中可定義任何標識符,他們不會與任何已有的標識符發(fā)生沖突缎讼,因為已有的定義都處于其他命名空間中。
    ——引自于 維基百科 https://zh.wikipedia.org/wiki/命名空間 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末血崭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夹纫,更是在濱河造成了極大的恐慌,老刑警劉巖舰讹,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異月匣,居然都是意外死亡,警方通過查閱死者的電腦和手機桶错,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糯钙,“玉大人,你說我怎么就攤上這事任岸。” “怎么了享潜?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵嗅蔬,是天一觀的道長剑按。 經(jīng)常有香客問我澜术,道長,這世上最難降的妖魔是什么鸟废? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮盒延,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘添寺。我一直安慰自己,他們只是感情好计露,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布楞捂。 她就那樣靜靜地躺著趋厉,像睡著了一般胶坠。 火紅的嫁衣襯著肌膚如雪君账。 梳的紋絲不亂的頭發(fā)上沈善,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音闻牡,去河邊找鬼。 笑死罩润,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的割以。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼猜极,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跟伏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤受扳,失蹤者是張志新(化名)和其女友劉穎奥溺,沒想到半個月后辞色,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浮定,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年桦卒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片建蹄。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡碌更,死狀恐怖洞慎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劲腿,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布焦人,位于F島的核電站,受9級特大地震影響花椭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矿辽,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗦锐。 院中可真熱鬧,春花似錦奕污、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘱根。三九已至,卻和暖如春该抒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凑保。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欧引,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓憋肖,卻偏偏與公主長得像因痛,于是被迫代替她去往敵國和親岸更。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容