一、模塊基礎
什么是模塊?
-
包含 Python 定義和語句的 .py 文件
-
解決代碼復用和組織問題
-
每個模塊有自己的命名空間
創建模塊示例
# fibo.py - 斐波那契模塊
def fib(n):"""打印小于n的斐波那契數列"""a, b = 0, 1while a < n:print(a, end=' ')a, b = b, a + bprint()def fib2(n):"""返回小于n的斐波那契數列列表"""result = []a, b = 0, 1while a < n:result.append(a)a, b = b, a + breturn result
二、模塊詳解
導入方式
- 基本導入
import fibo
fibo.fib(1000) # 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
fibo.fib2(100) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
- 導入特定函數
from fibo import fib, fib2
fib(500) # 直接使用,無需模塊名前綴
- 導入所有(不推薦)
from fibo import * # 可能污染命名空間
- 使用別名
import fibo as fib
fib.fib(500)from fibo import fib as fibonacci
fibonacci(500)
模塊特性
-
一次性初始化:模塊代碼只在第一次導入時執行
-
獨立命名空間:避免命名沖突
-
可重載:使用 importlib.reload()
1 以腳本方式執行模塊
雙重用途模式
# 在模塊末尾添加:
if __name__ == "__main__":import sysfib(int(sys.argv[1]))
使用方法:
# 作為腳本執行
python fibo.py 50
# 輸出: 0 1 1 2 3 5 8 13 21 34# 作為模塊導入
import fibo # 不執行測試代碼
2 模塊搜索路徑
Python 搜索模塊的順序:
-
內置模塊 (sys.builtin_module_names)
-
sys.path 中的目錄:
-
當前腳本目錄
-
PYTHONPATH 環境變量
-
標準庫和 site-packages
import sys
print(sys.path) # 查看搜索路徑
sys.path.append('/my/module/path') # 添加自定義路徑
3 編譯的 Python 文件
-
緩存文件:pycache/module.version.pyc
-
自動對比源碼修改日期
-
提高加載速度,不影響執行速度
優化選項:
python -O script.py # 去除斷言
python -OO script.py # 去除斷言和文檔字符串
三、標準模塊
常用標準模塊
import sys# 交互模式提示符
sys.ps1 = 'C> ' # 主提示符
sys.ps2 = '... ' # 次提示符(僅交互模式)# 模塊搜索路徑操作
sys.path.append('/ufs/guido/lib/python')# 平臺特定模塊
try:import winreg # 僅Windows可用
except ImportError:print("winreg module not available")
四、dir() 函數
查看對象內容
import fibo, sys# 查看模塊內容
print(dir(fibo)) # ['__name__', 'fib', 'fib2']
print(dir(sys)) # 顯示sys模塊的所有屬性# 查看當前命名空間
a = [1, 2, 3, 4, 5]
import fibo
fib = fibo.fib
print(dir()) # 顯示所有當前定義的名稱# 查看內置函數
import builtins
print(dir(builtins))
五、包(Package)
包的結構
sound/ # 頂層包__init__.py # 初始化包(必需)formats/ # 子包__init__.pywavread.pywavwrite.pyeffects/ # 子包__init__.pyecho.pysurround.pyfilters/ # 子包__init__.pyequalizer.py
導入方式
- 絕對導入
import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
- 從包中導入模塊
from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
- 直接導入函數
from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)
1 從包中導入 *
控制導入內容
# sound/effects/__init__.py
__all__ = ["echo", "surround", "reverse"]# 使用
from sound.effects import * # 只導入 __all__ 中指定的模塊
注意事項
# 如果本地有同名函數,會覆蓋子模塊
__all__ = ["echo", "surround", "reverse"]def reverse(msg: str): # 這會覆蓋 reverse.py 子模塊return msg[::-1]
2 相對導入
包內模塊引用
# 在 sound/effects/surround.py 中
from . import echo # 從當前包導入
from .. import formats # 從上級包導入
from ..filters import equalizer # 從兄弟包導入
注意: 主模塊必須使用絕對導入
3 多目錄中的包
擴展包路徑
# 修改包的搜索路徑
import mypackage
mypackage.__path__.append("/path/to/extra/modules")
六、? 重要特性總結
模塊特性
-
name 變量:模塊名,“main” 表示直接運行
-
獨立命名空間:避免全局變量污染
-
一次性初始化:避免重復執行初始化代碼
包特性
-
必須包含 init.py:標識目錄為包
-
分層組織:使用點號表示法
-
相對導入:支持包內模塊間的相對引用
最佳實踐
-
使用絕對導入:提高代碼可讀性和可維護性
-
避免 from module import *:明確導入所需內容
-
使用 if name == “main”:使模塊可執行也可導入
-
合理組織包結構:按功能劃分模塊
七、🔧 實用技巧
動態導入
# 按需導入模塊
module_name = "json"
json = __import__(module_name)# 使用 importlib
import importlib
json = importlib.import_module("json")
查看模塊信息
import mathprint(math.__name__) # 模塊名
print(math.__file__) # 模塊文件路徑
print(math.__doc__) # 模塊文檔字符串
重載模塊
# 開發時重新加載模塊
import importlib
importlib.reload(module_name)
八、🎯 模塊系統優勢
-
代碼復用:避免重復造輪子
-
命名空間管理:避免命名沖突
-
代碼組織:大型項目的結構化基礎
-
維護性:便于團隊協作和代碼維護
Python 的模塊系統是其生態系統繁榮的基礎,理解和熟練使用模塊系統是成為 Python 開發高手的關鍵一步!