本文 AI 產出,尚未審核

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.pimath.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.joinpathlib.Path(Python 3.4+)統一路徑操作。
sys.argv 直接取值 當參數不足時會拋出 IndexError 使用 argparse 或自行檢查 len(sys.argv),提供友善錯誤訊息。
mathcmath 混用 math 只接受實數,若傳入負數的平方根會拋 ValueError 需要複數運算時改用 cmath;或在呼叫前先檢查數值範圍。
random 種子未重置 在測試時忘記設 seed,導致結果不一致。 在單元測試或可重現的模擬中,必須在每次測試前呼叫 random.seed()
datetime 時區處理不當 直接使用 datetime.now() 產生本地時間,跨時區比較時會出錯。 使用 datetime.now(tz=timezone.utc)pytz/zoneinfo 取得帶時區的時間物件。

實際應用場景

  1. 自動化資料備份
    使用 os 讀取目錄、shutil(同屬標準庫)搬移檔案、datetime 產生時間戳記,組合成每日備份腳本。

  2. 命令列工具
    透過 sys.argvargparse 解析參數,結合 random 產生測試資料,快速建立 CLI 程式。

  3. 科學計算與圖形
    math 提供高精度的三角、對數與常數,配合 matplotlib(第三方)繪製函式圖形,適合教學與報告。

  4. 遊戲與模擬
    random 用於隨機事件、怪物掉落機率;datetime 計算冷卻時間與每日任務重置。

  5. 日志與排程
    datetime 產生檔名或日志頭部,os 判斷檔案大小、輪替(log rotation),形成完整的日誌管理系統。


總結

標準函式庫是 Python 最強大的基礎建設,掌握 os、sys、math、random、datetime 等核心模組,你就能:

  • 快速完成檔案與系統操作ossys
  • 進行精準的數學與統計計算mathrandom
  • 處理時間與日期的各種需求datetime

在寫程式的過程中,記得遵守 最佳實踐(如使用 os.path.join、檢查參數、設定隨機種子、正確處理時區),即可減少錯誤、提升程式可讀性與可維護性。未來若有更進階的需求,Python 仍提供了豐富的第三方套件,但 標準函式庫永遠是最可靠的第一選擇。祝你在 Python 的道路上,玩得開心、寫得順手!