模塊與包
模塊化編程是什么?用生活例子秒懂
想象你在搭樂高積木:
- 每個小積木塊都有特定功能(比如輪子、窗戶、墻壁)—— 這就像模塊(一個.py 文件,封裝了函數或類)。
- 把相關的積木塊裝進一個盒子里,方便分類和取用 —— 這就像包(一個文件夾,里面裝多個模塊和子包,帶__init__.py 標識)。
模塊化編程的核心思想是:把復雜代碼拆成小而獨立的 "積木",需要時直接拿來用,不用重復造輪子。
1.模塊的概念
? ? ? ? 模塊就是一個.py為后綴的python文件,可以被其它Python程序導入和使用,也可以自己獨立運行,里面存放著的是一組相關函數或者類。
1.1模塊的導入
? ? ? ? 模塊的導入使用import關鍵字,配合from和as有以下幾種用法:
導入方式 | 語法示例 | 適用場景 |
---|---|---|
導入整個模塊 | import math | 需要用模塊里的多個功能,用模塊名.功能 調用 |
導入模塊并取別名 | import numpy as np | 模塊名太長(如 numpy→np),簡化代碼 |
導入模塊中的特定功能 | from os import getcwd | 只需要模塊里的 1-2 個功能,避免代碼冗余 |
導入特定功能并取別名 | from datetime import datetime as dt | 功能名太長或避免沖突 |
導入模塊中所有功能 | from random import * |
? ? ? ? import會把整個文件都導入進來,而使用from后可以只導入某一個模塊,節省空間
示例
# 1. 導入整個模塊
import math
print(math.sqrt(16)) # 用模塊名.功能調用 → 4.0# 2. 別名簡化
import pandas as pd # 約定俗成的別名,大家都這么用
df = pd.DataFrame({"name": ["Alice"]}) # 用別名調用# 3. 導入特定功能
from os import getcwd, chdir
print(getcwd()) # 直接用功能名 → 輸出當前目錄# 4. 功能取別名
from datetime import datetime as dt
print(dt.now()) # 用別名調用 → 輸出當前時間# 5. 導入所有功能(謹慎使用)
from random import *
print(randint(1, 10)) # 直接用函數名 → 隨機1-10的整數
1.2模塊的作用
- 令Python代碼的編寫不必從零開始,不要重復寫‘造輪子’的過程。
- 避免同意模塊內的命令沖突
- 方便代碼的管理與維護,提高代碼的可讀性
1.3模塊的分類:內置、第三方、自定義
1.3.1內置模塊(系統模塊)
????????Python解釋器自帶的標準庫模塊,可以直接導入使用,比如 keyword、os等,這些模塊可直接導入而不需要安裝,在所有安裝了Python 解釋器的電腦上都可以運行且每個py文件都會自動導入builtins模塊。
特點
-
即用即導入:直接
import
即可使用。 -
性能高效:通常使用 C 語言實現。
1.3.1.1常見模塊
模塊 | 功能 | 官方文檔 |
---|---|---|
math | 數學運算 | math --- 數學函數 — Python 3.12.10 文檔 |
os | 操作系統接口 | os --- Miscellaneous operating system interfaces — Python 3.13.5 文檔 |
os.path | 路徑相關 | os.path --- Common pathname manipulations — Python 3.13.5 文檔 |
datetime | 日期和時間 | datetime --- Basic date and time types — Python 3.13.5 文檔 |
random | 隨機數生成 | random --- Generate pseudo-random numbers — Python 3.13.5 文檔 |
time | 時間 | time --- Time access and conversions — Python 3.13.5 文檔 |
1.3.1.2方法示例?
- random模塊:
import random
random.randint(1, 6) # random.randint(a,b) 生產 a~b的隨機整數
random.randint(1, 6)
random.random() # random.random 生成包含0 但不包含1 的浮點數
random.choice("ABCD") # 從一個序列中,隨機返回一個元素
random.choice("ABCD")
L = [1, 2, 3, 6, 9]
random.choice(L)
random.shuffle(L) # random.shuffer(x) # 把列表X 打亂
print(L)
- ?time模塊
import timetime.time() # 返回當前時間的時間戳
time.ctime() #返回當前的UTC 時間的字符串
t1 = time.localtime() # 返回當前的本地時間元組
time.sleep(3) # 讓程序睡眠 n 秒
time.strftime("%Y-%m-%d", t1) # 格式化時間
time.strftime("%y-%m-%d", t1)
time.strftime('%Y-%m-%d %H:%M:%S', t1)
- ?os模塊:
# 1. os.getcwd(): 獲取當前工作目錄
import os
current_directory = os.getcwd()
print("當前工作目錄:", current_directory)# 2. os.chdir(path): 改變當前工作目錄
new_directory = "F:\\01.AI07.深度學習框架\\00.上課課件"
os.chdir(new_directory)
print("工作目錄已更改為:", os.getcwd())# 3. os.listdir(path='.'): 返回指定目錄下的所有文件和目錄列表
directory_path = "."
files_and_dirs = os.listdir(directory_path)
print("指定目錄下的文件和目錄列表:", files_and_dirs)# 4. os.mkdir(path): 創建目錄
new_directory = "new_folder"
os.mkdir(new_directory)
print(f"目錄 '{new_directory}' 已創建")# 5. os.rmdir(path): 刪除目錄
directory_to_remove = "new_folder"
os.rmdir(directory_to_remove)
print(f"目錄 '{directory_to_remove}' 已刪除")# 6. os.remove(path): 刪除文件
file_to_remove = "example.txt"
os.remove(file_to_remove)
print(f"文件 '{file_to_remove}' 已刪除")
1.3.2第三方模塊
1.3.2.1常見模塊?
模塊 | 功能 | 示例 |
---|---|---|
numpy | 數值計算 | 科學運算、矩陣操作 |
pandas | 數據分析 | 數據清洗與處理 |
matplotlib | 數據可視化 | 繪制圖表 |
requests | HTTP請求處理 | 爬取網頁內容,調用API |
flask | Web應用框架 | 快速搭建Web服務 |
1.3.2.2使用示例?
安裝更新與卸載
安裝 | pip install??numpy? pandas requests |
更新 | pip install?numpy? pandas requests |
卸載 | pip uninstall??numpy? pandas requests |
使用
- numpy 模塊
import numpy as np
array = np.array([1, 2, 3])
print(array.mean()) # 輸出: 平均值 2.0
- pandas 模塊
import pandas as pd
df = pd.DataFrame({"Name": ["Alice", "Bob"], "Age": [25, 30]})
print(df)
- ?requests 模塊:用
requests
爬取網頁內容
import requests# 發送請求獲取網頁內容
response = requests.get("https://api.github.com") # 調用GitHub開放API# 打印結果(JSON格式)
print(response.json()) # 輸出:GitHub API的返回數據(字典形式)
1.3.3自定義模塊
????????用戶根據需求自己編寫的.py文件。
1.3.3.1創建模塊
????????創建一個myutils.py
文件:
# utils.py
def add(a, b):return a + bdef greet(name):return f"Hello, {name}!"
1.3.3.2 使用模塊
????????創建一個main.py
文件,并導入自定義模塊:
# main.py
import myutilsprint(myutils.add(3, 5)) # 輸出: 8
print(myutils.greet("Alice")) # 輸出: Hello, Alice!
1.3.3.3 跨文件夾使用
????????在main.py
中:
'''
假設目錄結構如下:
project/utils/__init__.pymath_utils.pymain.py
'''
from utils.math_utils import addprint(add(3, 5)) # 輸出: 8
?
1.4模塊內置變量
- __name__:用于確定模塊是被直接運行還是被導入到其他模塊中。當一個模 塊被直接運行時,__name__的值是”__main__”,否則為模塊的名稱。
- __doc__:包含模塊的說明性文檔。
- __file__:包含模塊的文件路徑。
- __all__:定義一個模塊中的哪些變量、函數或類可以通過from module import *導入時可以用。
- __package__:包含模塊所在的包的名稱。
- __dict__:包含模塊的全局命名空間。
包
2.包的概念
-
作用:用于組織模塊的集合,形成層次化的結構,便于管理大型項目。
-
結構:
my_package/__init__.pymodule1.pymodule2.pysubpackage/__init__.pymodule3.py
2.1__init__.py文件的主要作用:
- 標識包目錄:告訴Python解釋器該文件所在的目錄應被視為一個包而不是一 個普通的目錄。如果沒有這個文件,可能會無法正常導入包內的模塊。
- 執行初始化代碼:在該文件中也可以存在代碼,在調用該包里的模塊時,該文 件里的代碼也會被運行。
- 控制包的導入行為:通過__all__來控制哪些模塊可以被導入,從而限制包的公 開接口,防止不需要的模塊導入。
- 提供包級別的命名空間:在該文件中定義的變量和函數可以在包的其他模塊中 共享。
- 批量導入模塊:在該文件中可以批量導入系統模塊或其他模塊。
示例:
# __init__.py 文件示例# 1. 批量導入系統模塊
import os
import sys
import datetime# 2. 定義包級別的變量
package_variable = "This is a package variable"# 3. 控制包的導入行為
__all__ = ['module1', 'module2']# 4. 執行初始化代碼
print("Initializing mypackage")# 注意:這個代碼會在包被導入時執行# 5. 導入包內的模塊
from . import module1
from . import module2
2.2導入包和子包
-
使用
import
關鍵字可以導入包和子包,以訪問其中的模塊和內容。
# 同模塊的導入規則import 包名 [as 包別名]import 包名.模塊名 [as 模塊新名]import 包名.子包名.模塊名 [as 模塊新名]from 包名 import 模塊名 [as 模塊新名]from 包名.子包名 import 模塊名 [as 模塊新名]from 包名.子包名.模塊名 import 屬性名 [as 屬性新名]# 導入包內的所有子包和模塊from 包名 import *from 包名.模塊名 import *
?示例:
# 導入包中的模塊
import matplotlib.pyplot as plt# 導入子包中的模塊
from sklearn.linear_model import LinearRegression
2.3第三方包的相關操作:
安裝 | pip install package-name==version |
更新 | pip install –upgrade package-name |
卸載 | pip uninstall package-name |
2.4包的創建
3.模塊與包的區別
模塊 | 包 |
---|---|
一個Python文件 | 一個包含__init__.py 的文件夾 |
提供基本功能單元 | 用于組織多個模塊 |
文件名為.py | 目錄名 |
?
4. 解析順序
????????在使用 import module_name時,Python 會按照特定順序搜索并加載模塊。
4.1 模塊解析順序
查找優先級 | 查找位置 | 說明 |
---|---|---|
1?? 內置 C 擴展模塊 | sys.builtin_module_names | 如 math , sys , time , os |
2?? sys.modules 緩存 | sys.modules | 避免重復加載 |
3?? 當前目錄 | os.getcwd() | 同名文件或目錄 |
4?? PYTHONPATH 變量 | sys.path | 環境變量指定的路徑 |
5?? Python 標準庫 | /usr/lib/python3.x/Lib/ | 標準 Python 庫 |
6?? site-packages (第三方庫) | site.getsitepackages() | pip install 安裝的模塊 |
7?? __pycache__/*.pyc | __pycache__/ | 預編譯字節碼 |
?
4.2 內置C擴展模塊
????????最高優先級,Python 直接加載,不查找文件
4.3 sys.modules
????????如果模塊已加載,則直接返回,避免重復導入
import sys
print(sys.modules.keys()) # 查看已加載的模塊
4.4 當前目錄
????????如果 C 擴展模塊中找不到,就查找當前目錄下是否有 module_name.py 或 module_name 目錄
import os
print(os.getcwd()) # 查看當前目錄
4.5 PYTHONPATH
????????如果當前目錄沒有該模塊,則檢查 $PYTHONPATH$ 環境變量中的目錄
import sys
print(sys.path) # 列出所有可能的搜索路徑sys.path.insert(0, "/custom/path/") # 添加路徑
4.6 標準庫
如果前面路徑都找不到,會查找標準庫中的模塊。
4.7 第三方模塊
最后,進入 site-packages 目錄查找安裝的第三方模塊。
import site
print(site.getsitepackages())
4.8 __pycache__/
????????從__pycache__/
目錄中加載 .pyc
文件,而不是重新解析 .py
文件。
????????你可以刪除 __pycache__/
讓 Python 重新編譯 .py。
5.總結:模塊化編程的核心價值
????????模塊化編程讓Python代碼從"一團亂麻"變成"井然有序的積木": ?
- - 代碼復用:寫一次功能,到處調用,不用重復勞動。 ?
- - 易于維護:模塊獨立,改一處不影響其他部分。 ?
- - 團隊協作:多人分工寫不同模塊,最后像拼積木一樣組合。 ?
????????記住:學好模塊和包,是從"寫腳本"到"開發項目"的關鍵一步。下次寫代碼時,試試把常用功能拆成模塊——你會發現代碼變得清爽又好維護!