模組定義
- 一個py 檔案就是一個模組
- 三層架構: 總(分析功能,分配功能)-->分(給每個檔案分配任務)-->總(將所有功能綜合起來)
- 可以增加程式的健壯性和可讀性,
- 增加開發效率
模組的來源
- python直譯器內建的模組(直接import呼叫)
- 自己寫的檔案
- 別人寫好的成熟模組(先用 pip install,再import)
模組的存在形式
- 單模組
- 自己定義的功能所在的py檔案
- 包
- 將多個Py檔案放到一個資料夾下
- 必須有__init__.py檔案
import語句發生的內部原理
- 前提是有一個py檔案,並且有自己的名稱空間
- 透過import匯入模組,將所有原始碼執行一變
- 如果沒有呼叫函式,則不會呼叫,而是檢索到所有函式地址
- 自動建立一個當前檔案的名稱空間,與自己的名稱空間合併
- 我們透過模組名.屬性名來呼叫模組中的物件
多模組匯入
- 單獨匯入
- import a,b,c,d,...
- 單獨匯入
- import a
- import b
- import c
詳細匯入語法
- 只想要具體的指定的引數或者方法
- from a import b
- 這樣匯入可以不用模組.b了
- 直接b領用
- 匯入模組中的所用方法
- from a import *
對匯入的模組/模組中的物件重新命名
- import a as b #把a模組改名為b,呼叫時如下:
- b.方法
- 在模組與原檔案物件重複時
迴圈匯入問題
定義:
- a呼叫b,b呼叫a
解決方法
- 直接將匯入模組的語法放到最後
- 會導致沒得用
- 放到指定的函式內部,只要函式不呼叫就不會觸發匯入語句
搜尋模組的優先順序
-
查詢模組時的查詢順序
- 模組分類
- 純python編寫的模組
- 內建的一系列模組,包括Python直譯器自帶的和已經用pip install的
- 使用C語言編寫的底層程式碼
- C和C++擴充套件的模組
- 載入從下往上
- 查詢從上往下
- 模組分類
-
查詢順序
-
相對路徑
- 不給路徑就預設在當前目錄
- ./當前目錄
- ../上層目錄
-
絕對路徑
-
sys.path
-
-
包
包的定義
- 模組的集合資料夾,必須包含init方法
包的建立
- pycharm右鍵python package,會自動生成init檔案
包的使用
-
直接匯入
-
from 包 import 模組 使用: 模組.方法()
-
-
先在init中註冊:init就相當於包的目錄
-
init註冊: from .模組 import 方法 使用: from 包 import 方法 方法() 原因:匯入包時,多了一步操作就是先在init裡匹配方法,找不到然後再挨個模組查詢
json模組
json用途:
- 序列化
- 將python中的字典、列表等型別轉換為字串
- 型別強轉也可以實現,但是不能轉回(不可逆)
- 反序列化
- 將python中的字串轉換wield字典、列表等型別
匯入
-
import json: with open('file.json','w',encoding='utf8') as p: json.dump(user_dict,fp) 寫入內容單引號會自動轉換為雙引號,然後儲存。 可以實現將字典以字串格式寫入檔案,讀取時還是字典
json檔案轉為python物件
import json:
with open('file.json','w',encoding='utf8') as p:
json.load(fp)
讀取時還是字典
轉換:反序列化
- data_json_str =json.dumps(obj) #把字典轉為了字串
- data_dict = json.loads(obj) #把字串轉為了字典
json儲存資料時的特點
- 中文內容會自動儲存為二進位制
- 解決方法:ensure_ascii = False 就可以在寫入時不被寫成asscii碼