Python 課程 – 模組與套件(Modules & Packages)
主題:標準函式庫介紹(os、sys、math、random、datetime 等)
簡介
在 Python 的開發生態系中,標準函式庫(Standard Library) 是最直接、最可靠的資源。它隨 Python 本體一起安裝,提供了檔案操作、系統資訊、數學計算、隨機數產生、時間與日期處理等常見需求的完整實作。對於 初學者 來說,熟悉這些模組能讓你快速完成日常腳本與小型專案;對於 中級開發者,則能減少外部套件的依賴、提升程式的可移植性與效能。
本篇文章將以 os、sys、math、random、datetime 為例,說明它們的核心功能、常見用法與實務應用,並提供可直接執行的程式碼範例,協助你在實際開發中即時上手。
核心概念
1️⃣ os – 與作業系統互動的橋樑
os 模組提供了檔案系統、環境變數、執行緒等與作業系統相關的 API。常見功能包括:
| 功能 | 常用函式 | 說明 |
|---|---|---|
| 取得當前工作目錄 | os.getcwd() |
回傳目前程式執行所在的目錄路徑 |
| 切換目錄 | os.chdir(path) |
改變工作目錄至 path |
| 列出目錄內容 | os.listdir(path) |
取得 path 下所有檔案與子目錄名稱 |
| 建立/刪除目錄 | os.mkdir(path), os.rmdir(path) |
建立或移除單一目錄 |
| 路徑拼接 | os.path.join(a, b, ...) |
自動依作業系統使用正確的分隔符號 |
程式碼範例 1:遍歷目錄並列出所有 .txt 檔案
import os
def list_txt_files(root_dir):
"""列出 root_dir 及其子目錄下所有 .txt 檔案的絕對路徑"""
txt_files = []
for dirpath, dirnames, filenames in os.walk(root_dir):
for fname in filenames:
if fname.lower().endswith('.txt'):
txt_files.append(os.path.join(dirpath, fname))
return txt_files
# 示範執行
if __name__ == "__main__":
for f in list_txt_files('.'):
print(f)
這段程式使用
os.walk深度遍歷,不需要自行處理子目錄的遞迴,非常適合快速搜尋檔案。
2️⃣ sys – 取得直屬 Python 直譯器資訊
sys 模組讓你掌握程式執行環境、命令列參數、模組搜尋路徑等資訊。
| 功能 | 常用屬性/函式 | 說明 |
|---|---|---|
| 命令列參數 | sys.argv |
以 list 形式提供執行程式時傳入的參數 |
| Python 版本 | sys.version |
完整的版本字串 |
| 模組搜尋路徑 | sys.path |
import 時會依序搜尋的目錄清單 |
| 結束程式 | sys.exit([code]) |
立即終止執行,code 為返回值 (0 為成功) |
程式碼範例 2:簡易的命令列參數解析器
import sys
def main():
if len(sys.argv) < 2:
print("使用方式: python script.py <name>")
sys.exit(1)
name = sys.argv[1]
print(f"Hello, {name}! (Python {sys.version.split()[0]})")
if __name__ == "__main__":
main()
只要在終端機執行
python script.py Alice,程式就會顯示歡迎訊息與目前 Python 版本。
3️⃣ math – 高精度數學運算
math 提供了常見的數學函式(三角、指數、對數、常數等),所有運算皆使用 浮點數(float)且效能優於自行實作的 Python 迴圈。
| 常用函式 | 說明 |
|---|---|
math.sqrt(x) |
平方根 |
math.sin(x), math.cos(x), math.tan(x) |
三角函式(參數為弧度) |
math.log(x, base=math.e) |
對數,預設自然對數 |
math.factorial(n) |
階乘(n 必須是非負整數) |
math.pi, math.e |
常用常數 |
程式碼範例 3:計算正多邊形的內角和
import math
def interior_angle_sum(sides: int) -> float:
"""
正 n 邊形的內角總和(度數)。
公式: (n - 2) * 180
"""
if sides < 3:
raise ValueError("邊數必須大於等於 3")
return (sides - 2) * 180
def circumradius(side: float, sides: int) -> float:
"""
計算正多邊形的外接圓半徑。
公式: r = a / (2 * sin(π / n))
"""
return side / (2 * math.sin(math.pi / sides))
# 示範
if __name__ == "__main__":
n = 6 # 六邊形
a = 5.0 # 每邊長 5 單位
print(f"{n} 邊形的內角總和: {interior_angle_sum(n)}°")
print(f"外接圓半徑: {circumradius(a, n):.3f}")
透過
math.pi與math.sin,我們可以在 不到 10 行程式 內完成幾何計算,且精度符合科學需求。
4️⃣ random – 隨機數與抽樣工具
random 為產生 偽隨機 數值的標準模組,常用於模擬、測試資料、遊戲等情境。
| 功能 | 常用函式 | 說明 |
|---|---|---|
| 產生 0~1 之間的浮點數 | random.random() |
包含 0 但不含 1 |
| 產生指定範圍的整數 | random.randint(a, b) |
包含兩端 |
| 隨機抽樣(不重複) | random.sample(population, k) |
從序列中抽取 k 個不重複元素 |
| 隨機排列 | random.shuffle(seq) |
原地打亂序列 |
| 設定種子 | random.seed(a=None) |
讓結果可重現 |
程式碼範例 4:簡易的抽獎系統
import random
participants = [
"Alice", "Bob", "Charlie", "Diana",
"Ethan", "Fiona", "George", "Hannah"
]
def draw_winners(num_winners: int, seed: int = None):
"""抽出不重複的得獎者,若提供 seed 則結果可重現"""
if seed is not None:
random.seed(seed)
return random.sample(participants, k=num_winners)
# 抽出 3 位得獎者
winners = draw_winners(3, seed=2025)
print("恭喜以下得獎者:", ", ".join(winners))
只要改變
seed,抽獎結果就會改變;若去除seed,每次執行都會得到不同的組合。
5️⃣ datetime – 日期與時間的處理神器
datetime 允許你 建立、運算、格式化 日期與時間物件,支援時區(timezone)與時間差(timedelta)。
| 類別 | 常用屬性/方法 | 說明 |
|---|---|---|
datetime.datetime |
.now(), .utcnow(), .fromtimestamp(ts) |
代表「年、月、日、時、分、秒」的完整時間 |
datetime.date |
.today(), .fromisoformat(str) |
僅包含日期(年、月、日) |
datetime.time |
.hour, .minute 等 |
僅包含時間 |
datetime.timedelta |
days, seconds, total_seconds() |
時間差,支援加減運算 |
datetime.timezone |
datetime.timezone.utc |
建立具時區資訊的 datetime 物件 |
程式碼範例 5:計算兩個日期之間的工作天數(排除週末)
from datetime import datetime, timedelta
def business_days(start: str, end: str) -> int:
"""
計算 start 與 end 之間的工作天數(含 start、end)。
日期字串格式: 'YYYY-MM-DD'
"""
start_dt = datetime.strptime(start, "%Y-%m-%d")
end_dt = datetime.strptime(end, "%Y-%m-%d")
if start_dt > end_dt:
start_dt, end_dt = end_dt, start_dt
total_days = (end_dt - start_dt).days + 1
work_days = 0
for i in range(total_days):
day = start_dt + timedelta(days=i)
if day.weekday() < 5: # 0=Mon, 4=Fri 為工作日
work_days += 1
return work_days
# 範例
print(business_days("2025-01-01", "2025-01-31")) # 23 個工作天
透過
datetime.strptime解析字串,再利用timedelta迭代每一天,簡潔且易讀。
常見陷阱與最佳實踐
| 陷阱 | 說明 | 建議的最佳實踐 |
|---|---|---|
| 未處理檔案路徑分隔符 | 直接使用 'C:\\folder\\file.txt' 會在不同作業系統上失效。 |
使用 os.path.join 或 pathlib.Path(Python 3.4+)統一路徑操作。 |
sys.argv 直接取值 |
當參數不足時會拋出 IndexError。 |
使用 argparse 或自行檢查 len(sys.argv),提供友善錯誤訊息。 |
math 與 cmath 混用 |
math 只接受實數,若傳入負數的平方根會拋 ValueError。 |
需要複數運算時改用 cmath;或在呼叫前先檢查數值範圍。 |
random 種子未重置 |
在測試時忘記設 seed,導致結果不一致。 | 在單元測試或可重現的模擬中,必須在每次測試前呼叫 random.seed()。 |
datetime 時區處理不當 |
直接使用 datetime.now() 產生本地時間,跨時區比較時會出錯。 |
使用 datetime.now(tz=timezone.utc) 或 pytz/zoneinfo 取得帶時區的時間物件。 |
實際應用場景
自動化資料備份
使用os讀取目錄、shutil(同屬標準庫)搬移檔案、datetime產生時間戳記,組合成每日備份腳本。命令列工具
透過sys.argv或argparse解析參數,結合random產生測試資料,快速建立 CLI 程式。科學計算與圖形
math提供高精度的三角、對數與常數,配合matplotlib(第三方)繪製函式圖形,適合教學與報告。遊戲與模擬
random用於隨機事件、怪物掉落機率;datetime計算冷卻時間與每日任務重置。日志與排程
datetime產生檔名或日志頭部,os判斷檔案大小、輪替(log rotation),形成完整的日誌管理系統。
總結
標準函式庫是 Python 最強大的基礎建設,掌握 os、sys、math、random、datetime 等核心模組,你就能:
- 快速完成檔案與系統操作(
os、sys) - 進行精準的數學與統計計算(
math、random) - 處理時間與日期的各種需求(
datetime)
在寫程式的過程中,記得遵守 最佳實踐(如使用 os.path.join、檢查參數、設定隨機種子、正確處理時區),即可減少錯誤、提升程式可讀性與可維護性。未來若有更進階的需求,Python 仍提供了豐富的第三方套件,但 標準函式庫永遠是最可靠的第一選擇。祝你在 Python 的道路上,玩得開心、寫得順手!