《Python從小白到大牛》第4章 Python語法基礎

本章主要爲大家介紹Python的一些語法,其中包括標識符、關鍵字、常量、變量、表達式、語句、註釋、模塊和包等內容。

標識符和關鍵字

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

標識符

標識符就是變量、常量、函數、屬性、類、模塊和包等由程序員指定的名字。構成標識符的字符均有一定的規範,Python語言中標識符的命名規則如下:

  1. 區分大小寫:Myname與myname是兩個不同的標識符。

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

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

  4. 關鍵字不能作爲標識符。

  5. 不要使用Python內置函數作爲自己的標識符。

例如,身高、identifier、userName、User_Name、_sys_val等爲合法的標識符,注意中文“身高”命名的變量是合法的;而2mail、room#、\$Name和class爲非法的標識符,注意#和\$不能構成標識符。

關鍵字

關鍵字是類似於標識符的保留字符序列,由語言本身定義好的,Python語言中有33關鍵字。只有三個,即False、None和True首字母大寫,其他的全部小寫。具體內容見表4-1所示。

表 4‑1 Python關鍵字

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小程序,其中就用到了變量。常量和變量是構成表達式的重要組成部分。

變量

在Python中聲明變量時不需要指定它的數據類型,只要是給一個標識符賦值就聲明瞭變量,示例代碼如下:

# 代碼文件:chapter4/src/ch4.2.1.kt

_hello = "HelloWorld" ①
score_for_student = 0.0 ②
y = 20 ③
y = True ④

代碼第①行、第②行和第③行分別聲明瞭三個變量,這些變量聲明不需要指定數據類型,你賦給它什麼數值,它就是該類型變量了。注意代碼第④行是給y變量賦布爾值True,雖然y已經保存了整數類型20,但它也可以接收其他類型數據。

提示
Python是動態類型語言^1,它不會檢查數據類型,在變量聲明時不需要指定數據類型。這一點與Swift和Kotlin語言不同,Swift和Kotlin雖然在聲明變量時也可以不指定數據類型,但是他們的編譯器會自動推導出該變量的數據類型,一旦該變量確定了數據類型,就不能再接收其他類型數據了,這一點與Python不同。

常量

在很多語言中常量的定義是一旦初始化後就不能再被修改。而Python不能從語法層面上定義常量,Python沒有提供一個關鍵字使得變量不能被修改。所以在Python中只能將變量當成常量使用,只是不要修改它。那麼這就帶來了一個安全隱患,可能會在無意中被修改,從而引發程序錯誤。解決此問題要麼靠程序員自律和自查;要麼通過一些技術手段使變量不能修改。

提示
Python作爲解釋性動態語言,代碼安全很多情況下需要程序員自查的。而Java和C等靜態類型語言,這些問題會在編譯期檢查出來。

註釋

Python程序註釋使用井號(#),使用時#位於註釋行的開頭,#後面有一個空格,接着是註釋內容。

另外,在第3章還介紹過文檔字符串,它也是一種註釋,只是用來註釋文檔的,文檔註釋將在第5章詳細介紹。

使用註釋示例代碼如下:

# coding=utf-8 ①
# 代碼文件:chapter4/4.3/hello.py ②
# _hello = "HelloWorld" ③
# score_for_student = 0.0 ④
 y = 20
 y = "大家好"
 print(y) # 打印y變量 ⑤

代碼①和②行#號是進行單號註釋,#號也可連續註釋多行見代碼第③行\~第④行,可以在一條語句的尾端進行註釋見代碼第⑤行。注意代碼①行#
coding=utf-8註釋作用很特殊是設置Python代碼文件的編碼集,該註釋語句必須放在文件的第一行或第二行纔能有效。它還有替代寫法:

#!/usr/bin/python
# -*- coding: utf-8 -*-

其中#!/usr/bin/python註釋是在UNIX、Liunx和macOS等平臺上安裝多個Python版本時,具體指定哪個版本的Python解釋器。

提示
在PyCharm工具中對連續多行的註釋可以使用快捷鍵,具體步驟是:選擇多行然後按住“Ctrl+斜槓”組合鍵進行註釋。去掉註釋也是按住“Ctrl+斜槓”組合鍵。

注意
在程序代碼中,對容易引起誤解的代碼進行註釋是必要的,但應避免對已清晰表達信息的代碼進行註釋。需要注意的是,頻繁的註釋有時反映了代碼的低質量。當覺得被迫要加註釋的時候,不妨考慮一下重寫代碼使其更清晰。

語句

Python代碼是由關鍵字、標識符、表達式和語句等內容構成,語句是代碼的重要組成部分。

語句關注的代碼執行過程,如if、for和while等。在Python語言中,一行代碼表示一條語句,語句結束可以加分號,也可以省略分號。

示例代碼:

# coding=utf-8
# 代碼文件:chapter4/4.4/hello.py

_hello = "HelloWorld"
score_for_student = 0.0;  # 沒有錯誤發生
y = 20

name1 = "Tom"; name2 = "Tony" ①

提示
從編程規範的角度講語句結束不需要加分號,而且每行至多包含一條語句。代碼第①行的寫法是不規範的,推薦使用:
name1 = "Tom"
name2

Python還支持鏈式賦值語句,如果需要爲多個變量賦相同的數值,可以這樣表示:

a = b = c = 10

這條語句是把整數10賦值給a、b、c三個變量。

另外,在if、for和while有代碼塊的語句中,代碼塊不是通過大括號來界定的,而是通過縮進,縮進在一個級別的代碼是在相同的代碼塊中。

# coding=utf-8
# 代碼文件:chapter4/4.4/hello.py

_hello = "HelloWorld"
score_for_student = 10.0;  # 沒有錯誤發生
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個空格,考慮到不同的編輯器製表符顯示的寬度不同,大部分編程語言規範推薦使用4個空格。

模塊

Python中一個模塊就是一個文件,模塊是保存代碼的最小單位,模塊中可以聲明變量、常量、函數、屬性和類等Python程序元素。一個模塊提供可以訪問另外一個模塊中的程序元素。

下面通過示例介紹模塊的使用,現有兩個模塊: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。爲了實現這個目的,可以通過兩種import語句導入模塊module1中的代碼元素:

  • import
    \<模塊名\>。代碼第①行,這種方式會導入模塊所有代碼元素,訪問時需要加“模塊名.”,見代碼第④行module1.y,module1是模塊名,y是模塊module1中的變量。

  • from \<模塊名\> import
    \<代碼元素\>。代碼第②行,這種方式會只是導入特定的代碼元素,訪問時不需要加“模塊名.”,見代碼第⑤行z變量,但是需要注意如果z變量在當前模塊中也有時,z不能導入,即z是當前模塊中的變量。

運行hello.py代碼輸出結果如下:

進入module1模塊
20
True
10.1

從運行結果可見import語句會運行導入的模塊,注意示例中使用了兩次import語句,但只執行一次模塊內容。

模塊事實上提供一種命名空間(namespace)^2。同一個模塊內部不能有相同名字的代碼元素,但是不同模塊可以,上述示例中的y命名的變量就是在兩個模塊中都有。

——引自於 維基百科 https://zh.wikipedia.org/wiki/命名空間

如果兩個相同名字的模塊,任何防止命名衝突呢?那就是使用(package),很多語言都提供了包,例如Java、Kotlin等,他們的作用都是一樣的提供一種命名空間。

創建包

重構4.5節示例,現有兩個模塊hello,他們放在不同的包com.pkg1和com.pkg2中,如圖4-1所示,從圖中可見包是按照文件夾的層次結構管理的,而且每個包下面會有一個init.py文件,它告訴解釋器這個這是一個包,這個文件內容一般情況下是空的,但可以編寫代碼。

圖4-1 包層次

既然包是一個文件夾加上一個空的init.py文件,那麼開發人員就可以自己在資源管理器中創建包。筆者推薦使用PyCharm工具中創建,它會創建文件夾的同時還會創建一個空的init.py文件。

具體步驟:使用PyCharm打開創建的項目,右擊項目選擇New → Python
Package菜單,如圖4-2所示,在彈出對話框中輸入包名com.pkg,其中com是一個包,pkg是它的下一個層次的包,中間用點(.)符號分隔。

圖4-2 PyCharm項目中創建包

包導入

包創建好後,將兩個模塊hello放到不同的包com.pkg1和com.pkg2中。由於
com.pkg1的hello模塊需要訪問com.pkg2的hello模塊中的元素。那麼任何導入呢?事實上還是通過import語句,需要在模塊前面加上包名。

重構4.5節示例,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.前綴。

代碼第②行是導入com.pkg2.hello模塊中z變量。from com.pkg2.hello import
z語句可以帶有別名,該語句修改爲如下代碼:

from com.pkg2.hello import z as x
print(x)  # 訪問com.pkg2.hello模塊變量z

使用別名的目的是防止發生命名衝突,也就是說要導入的z名字的變量在當前模塊總已經存在了,所以給z一個別名x。

本章小結

本章主要介紹了Python語言中最基本的語法,首先介紹了標識符和關鍵字,讀者需要掌握標識符構成,瞭解Python關鍵字。然後介紹了Python中的變量、常量、註釋和語句。最後介紹了模塊和包,其中理解模塊和包的作用,熟悉模塊和包導入方式。

配套視頻

http://edu.51cto.com/topic/1507.html

配套源代碼

http://www.zhijieketang.com/group/8

電子書

https://yuedu.baidu.com/ebook/5823871e59fafab069dc5022aaea998fcc2240fc

作者微博:@tony_關東昇br/>郵箱:[email protected]
智捷課堂微信公共號:zhijieketang
Python讀者服務QQ羣:628808216

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章