Python程序开发——第七章 模块与包
目錄
- 一、模塊的定義
- 二、導入模塊、調用模塊
- (一)import語句
- (二)from…import語句
- 三、標準模塊庫
- (一)sys模塊
- (二)os模塊
- (三)random模塊
- (四)time模塊
- 四、模塊導入特性
- (一)__all__屬性
- (二)__name__屬性
- 五、dir() 模塊查找函數
- 六、包
- (一)包的定義
- (二)包的創建
- (三)包的導入
一、模塊的定義
簡單的來說,模塊就是每個以.py為后綴的Python文件,可以通過在一個Python文件中導入其它Python文件,從而使用該模塊中的類、函數、變量等等,模塊可分為內置模塊、第三方模塊以及自定義模塊。
每一個python文件都可作為一個模塊存在,文件名即為模塊名,在程序開發中,會將耦合度較低的多個功能寫入不同的文件中,制作成模塊,并在其它文件中以導入模塊的方式使用自定義模塊中的內容。
二、導入模塊、調用模塊
(一)import語句
通過import語句可以一次導入一個或多個模塊,多個模塊中各模塊使用逗號隔開,如下:
import 模塊 import 模塊1,模塊2,…,模塊n另外可通過.來使用導入的模塊中的類或函數,即模塊名稱.類名稱/函數名稱()的形式。
若模塊名稱較長,還可通過as對模塊起別名,在調用時即可通過別名來調用模塊中的內容,即import 模塊名稱 as 別名。
下列python代碼,這是一個名為module.py的文件,作為模塊:
下列python代碼,這是一個名為123.py的文件,在該文件中引用module.py模塊文件中的input_number()函數,即module.input_number():
import module module.input_number()運行結果如下:
(二)from…import語句
from…import…語句的格式如下:
from 模塊名稱 import 變量名稱/類名稱/函數名稱和import語句一樣,可一次導入多個類、變量或函數,中間使用逗號隔開。另外還可以通過from … import *導入模塊中的全部內容。
三、標準模塊庫
python中自帶一些標準模塊庫,比如sys模塊、os模塊、random模塊以及time模塊等等,以下簡單地介紹這幾種標準模塊庫。
(一)sys模塊
sys模塊用于python運行時的環境操作,比如
sys.agrv獲取命令行參數列表,列表中第一個元素是該程序本身所在路徑;
sys.path用于獲取模塊的搜索路徑;
sys.exit()函數用于退出當前程序,其后的代碼不再執行,正常退出返回值為0。
下列python代碼,通過import sys引用sys模塊:
運行結果如下:
(二)os模塊
os模塊提供訪問操作系統(OS)服務的功能,比如os.getcwd()函數用于獲取當前腳本的工作路徑;os.chdir()函數用于改變當前腳本的工作路徑;os.remove()用于刪除指定文件;
os._exit()用于終止python程序,與sys.exit()不同,sys.exit()在執行后會引發一個SystemExit異常,若捕獲該異常則仍然會執行sys.exit()之后的代碼。
下列python代碼,通過import os引用os模塊:
運行結果如下:
(三)random模塊
random模塊用于產生隨機數,比如
random.random()用于返回(0,1]之間的隨機實數;
random.randint(x,y)用于返回[x,y]之間的隨機整數;
random.uniform(x,y)用于返回[x,y]之間的隨機浮點數;
random.choice(seq)用于從序列seq中隨機返回一個元素。
下列python代碼,通過import random引用random模塊:
運行結果如下:
(四)time模塊
time模塊提供一系列關于時間處理的函數,比如
1、time.time()用于獲取當前時間,可通過該函數計算程序的執行時間。
下列python代碼,這里計算10000!,即10000的階乘,通過time()函數計算計算10000的階乘所耗費的時間:
運行結果如下:
2、time.sleep(secs)函數使程序進入休眠態,休眠時間由secs參數決定,單位為秒,通過該函數可使程序中某個功能代碼設置休眠時間,即設置一段時間間隔后執行;
下列python代碼,通過random和time模塊庫,使用random.choice()函數隨機選擇列表中的一個元素,使用time.sleep(2)表示每隔2秒執行一次循環,另外remove() 函數用于移除列表中某個值的第一個匹配項:
運行結果如下:
3、time.strptime()函數用于將一個時間格式的字符串解析為時間元組,而time.mktime()函數用于將時間元組轉換為秒數,通過這兩個模塊函數即可自定義時間戳。
下列python代碼,time…strptime()函數將2021-11-10 22:21:41轉換為時間元組,time.mktime()函數將時間元組轉換為時間戳:
運行結果如下:
四、模塊導入特性
(一)__all__屬性
通過在python模塊的開頭定義一個__all__屬性,可以說這個屬性是一個列表,其中包含的元素規定了在通過使用from…import*語句導入模塊時所包含的模塊內內容。
下列python代碼,module.py模塊中設置了__all__屬性,即規定導入該模塊時只能使用out_number和out_page兩個函數:
下列python文件test.py中導入module模塊:
#test.py from module import * print(out_page(2, 0)) out_number() out_word()這里使用了out_word(),所以程序會報錯,顯示未定義:
正確的運行結果如下,去掉out_word() ,因為module.py模塊中__all__屬性中只允許使用out_number和out_page兩個函數:
(二)__name__屬性
__name__屬性用于在導入一個模塊時,使該模塊中的某一程序塊不執行,通常該屬性與if-else語句共同使用,若當前模塊是啟動模塊,即非測試時,設定其值為__name__=="__main__"。
__name__屬性用于在項目開發整合前避免項目運行時執行測試代碼。
下列python代碼,使用if-else條件語句:
#module.py模塊 def out_word():print("HELLO WORLD!")def out_number():a = input("請輸入一個數字:")print(f"輸入的數字為{a}")def out_page(x, y):return x * yif __name__ == "__main__":out_word()print(out_page(2, 0))out_number() else:print("另一模塊")運行結果如下:
在另一個模塊,即test.py中導入該模塊:
運行結果如下,可看到“另一模塊”:
五、dir() 模塊查找函數
dir()函數是一個內置函數,可以通過它查找到模塊內所有定義的名稱,并且以字符串列表的形式返回。
#module.py模塊 __all__ = ["out_number", "out_page"]def out_word():print("HELLO WORLD!")def out_number():a = input("請輸入一個數字:")print(f"輸入的數字為{a}")def out_page(x, y):return x * y查找module模塊中所有定義的名稱,可分為有參和無參,無參時則會返回所有定義的名稱:
#test.py import moduleprint(dir()) print(dir(module))運行結果如下:
六、包
(一)包的定義
為了更好理清python代碼,根據不同類別將模塊歸類劃分,并將功能相近的模塊放在同一個目錄下,使其層次化,從而形成了包,包是一個包含__init__.py文件的目錄,且該文件必須存在但可以為空,另外目錄下還有子包以及一些模塊。
包的存在可在一定程度上避免合作開發中模塊重名的問題,包中的init文件作用是標識當前目錄是一個python包以及模糊導入,即當該文件中沒有聲明__all__屬性時,則使用from…import*導入的內容為空。
(二)包的創建
這里只介紹PyCharm中如何創建一個包的步驟,版本為 Community Edition 2021.2.1。
1、點擊左上角的新建:
或在項目中右鍵新建:
2、選擇python軟件包(python package),點擊設置文件名稱。
3、可在項目欄看到創建的package1軟件包。
可以展開看到有個默認的__init__.py文件:
(三)包的導入
包的導入與模塊的導入一樣,使用import語句以及from…import語句,但在導入包中的模塊時,使用時需要在模塊名稱前加上包的名稱,即包的名稱.模塊名稱,若是使用已導入模塊中的函數則通過包的名稱.模塊名稱.函數名稱實現。
下列python代碼,創建package1軟件包,其中包括__init__.py文件、module1.py和module2.py文件:
項目欄中:
使用另一個模塊test.py導入該包,且通過import語句導入該包:
運行結果如下:
總結
以上是生活随笔為你收集整理的Python程序开发——第七章 模块与包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (*长期更新)软考网络工程师学习笔记——
- 下一篇: Python程序开发——第八章 文件