跳到主要內容

Day 12 模組與套件

Day 12 模組與套件

引言

當專案開始長大,把所有程式碼塞進同一個檔案會變得難以維護。這時候把程式拆成「模組」與「套件」,讓不同檔案各自負責一部分功能,是寫大型 Python 專案的基礎。模組化之後,每個人可以專心修改自己負責的部分,別人只需要知道「這個模組提供哪些函式」,而不必從頭讀完所有程式碼。

另一方面,Python 之所以好用,是因為有著豐富的第三方套件生態系:NumPy、Pandas、Requests、Django……,只要會用 pip 就能把它們裝進自己的專案。今天就要把這兩件事一起搞懂:先學怎麼組織自己的程式碼,再用 pip 與 venv 把外部套件與環境管理好。學會模組與套件之後,你就能把過去十天寫的小工具整理成可重複使用的程式庫,也準備好迎接接下來的資料科學章節。

匯入模組:import 的各種寫法

Python 的模組其實就是一個 .py 檔案,檔案名稱就是模組名稱。例如有個 utils.py,就可以透過 import 把它載入並使用裡面的函式。最簡單的寫法是直接 import 整個模組,使用時要寫「模組名.函式名」。這種寫法雖然稍長,但能清楚看出函式來自哪個模組,閱讀性較好。

# utils.py 內有一個 greet 函式
# greet(name) 會回傳 "Hello, {name}"

import utils
print(utils.greet("小明"))  # 輸出:Hello, 小明

如果只想要某幾個函式,可以用 from ... import,呼叫時就不必寫模組名。更進階的寫法還能搭配 as 替模組或函式取別名,避免名稱太長或撞名。

from utils import greet
print(greet("小華"))  # 直接呼叫,不用寫 utils.

import numpy as np  # 第三方套件常用別名 np
import pandas as pd  # 第三方套件常用別名 pd

from math import sqrt as square_root
print(square_root(16))  # 輸出:4.0

注意 from ... import * 雖然方便,會把模組內所有公開名稱(沒有底線開頭的)全部匯入,容易與自己定義的變數衝突,正式檔案中並不推薦。建議明確列出要匯入的東西,這樣未來除錯時能快速追蹤某個函式是從哪裡來的,也方便編輯器提供自動完成。

自建模組與 __name__ 的妙用

寫一個簡單的模組很直覺:把所有函式寫進 .py 檔案,存成可重複使用的工具。Python 還提供 __name__ 這個內建變數,它會根據 .py 檔案是被「直接執行」或「被 import」自動變成 "__main__" 或模組名稱。這個機制常用來寫測試程式碼,讓同一支程式既能當工具也能自我驗證。

# 檔案:calculator.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

if __name__ == "__main__":
    # 這段只在自己執行 python calculator.py 時會跑
    print("測試加法:", add(3, 5))
    print("測試減法:", subtract(10, 4))

當其他模組用 import calculator 載入時,底下那兩行 print 不會執行;但直接用 python calculator.py 執行時,就會跑測試。這是 Python 專案裡很常見的寫法,能讓同一個檔案兼顧「可被引用」與「可單獨測試」兩種用途。如果想寫更完整的測試,則可以導入 pytest 或 unittest 模組,這在後續開發資料處理工具時會很有用。

套件結構:把多個模組組織起來

當模組數量變多,把相關的 .py 檔案放進同一個資料夾,這個資料夾就稱為「套件」。套件需要一個特殊的 __init__.py 檔案,Python 看到它才會把資料夾當成套件處理(從 Python 3.3 起,名稱空間套件可省略,但實務上仍然建議保留)。__init__.py 在套件被首次載入時會自動執行,是初始化套件狀態的好地方。

# 專案結構
# my_project/
# ├── main.py
# └── mylib/
#     ├── __init__.py
#     ├── math_tools.py
#     └── string_tools.py

# mylib/math_tools.py
def double(x):
    return x * 2

# mylib/__init__.py
from .math_tools import double

# main.py
from mylib import double
print(double("main"))  # 輸出:mainmain

__init__.py 除了標示這是套件之外,也可以在裡面做「匯出哪些名稱」的設定,避免呼叫端看到太多內部細節。實務上常見的做法是把套件常用的 API 都寫在 __init__.py,讓使用者只要 import 套件就能用,例如 from mylib import double 而不用寫 from mylib.math_tools import double。子模組前面的句點 . 表示「目前套件內」,這是相對匯入的標準寫法,可以避免套件改名時要修改每一行 import。

用 pip 安裝第三方套件

pip 是 Python 內建的套件管理工具(從 Python 3.4 起預裝)。裝好的第三方套件會放到 site-packages 這個共享資料夾,所有專案都能呼叫。建議在每個專案裡都用 pip 明確指定版本,避免升級時造成不相容。當幾個專案共用全域 Python 環境時,常常會遇到「升級某個套件之後,另一個專案突然壞掉」的窘境,這正是後面 venv 章節要解決的問題。

pip install numpy
pip install pandas==2.2.3
pip install -r requirements.txt
pip list
pip show numpy

requirements.txt 是專案常用的套件清單檔,每行寫一個套件與版本,例如 numpy==2.1.3。把專案給別人時,只要附上這個檔案,對方就能用 pip install -r 一次裝齊。這是 Python 專案協作的標準做法,之後做資料科學專案時會大量用到。如果想要更精準地表達依賴關係(例如要求 numpy 至少 2.0 但不能超過 3.0),也可以在 requirements.txt 中寫成 numpy>=2.0,<3.0,pip 會自動挑選合適的版本。

用 venv 建立獨立環境

當你同時維護多個專案,可能會遇到 A 專案需要 Django 4、B 專案卻還在用 Django 3 的窘境。這時候用 venv 為每個專案建立獨立的虛擬環境,就能徹底隔離套件版本。venv 是 Python 3.3 起內建的標準工具,不需要額外安裝任何東西,是「官方推薦」的虛擬環境做法。

python -m venv .venv

# Windows 啟動
.venv\Scripts\activate

# macOS / Linux 啟動
source .venv/bin/activate

# 安裝套件後可以輸出清單
pip freeze > requirements.txt

# 離開環境
deactivate

啟動虛擬環境後,命令提示字元前面會出現 (.venv) 字樣,這時裝的套件只會活在這個資料夾裡。VS Code 與 PyCharm 都能自動偵測 .venv,建議每個新專案都從 venv 開始,避免污染全域的 Python。另外常見的命名習慣是把虛擬環境放在專案根目錄下的 .venv 或 venv 資料夾,並加入 .gitignore,這樣不同專案之間就不會互相干擾,部署到伺服器時也能用同一份 requirements.txt 還原出相同的環境。當你同時維護資料科學與網頁後端兩種專案時,venv 幾乎是必需品,否則套件版本衝突會讓你除錯除到天荒地老。

結語

今天把 Python 程式碼組織化的基礎都走過一輪:import 的各種寫法讓我們靈活引用別人的程式碼、自建模組與 __name__ 讓檔案可以被引用也可以單獨測試、套件結構把多個模組收納整齊、pip 與 requirements.txt 處理第三方套件、venv 則替每個專案建立乾淨的執行環境。這些工具看似瑣碎,卻是寫出可維護、可協作專案的關鍵。從今天起,建議每寫一個新專案就先建立 venv,把套件依賴關係從一開始就管好。

明天,我們會踏入物件導向的世界,從類別與物件開始學起。這是後續 PyTorch 神經網路模型的基礎觀念,因為到時候我們親手打造的 nn.Module 就是一個 class,懂物件導向才能看懂模型設計的邏輯。即使你目前只寫幾百行的小腳本,提前建立模組與套件的觀念,也能在日後接手大型專案時少走很多冤枉路。

留言

這個網誌中的熱門文章

Day 2 變數與資料型別

Day 2 變數與資料型別 引言 寫程式的過程中,變數與資料型別是處理資料的基礎。變數是存放資料的容器,資料型別則決定這筆資料有哪些特性、可以進行哪些操作。學會定義變數、認識各種資料型別,是學好 Python 的關鍵一步。 這篇文章會帶你了解 Python 中變數的觀念、如何定義變數,以及常見的資料型別,包括整數、浮點數、字串、布林值,還有串列、元組、字典與集合等容器型別。我們也會介紹變數的命名規則與撰寫風格建議,以及如何用 type() 檢查資料型別。 什麼是變數?如何在 Python 中定義變數 變數是在程式執行時用來存放資料的名稱。透過定義變數,我們可以給一筆資料一個名字,並在程式的其他地方用這個名字取用該筆資料。在 Python 中,變數不需要事先宣告型別,因為 Python 是動態型別語言,變數的型別由指定給它的值決定。 定義變數的基本語法 在 Python 中定義變數非常簡單,只要用賦值符號 = 把值指定給變數即可。例如: x = 5 # 定義變數 x,並把整數 5 賦值給它 name = "Alice" # 定義變數 name,並把字串 "Alice" 賦值給它 在這裡,x 是一個變數,被賦予整數 5;name 是另一個變數,被賦予字串 "Alice"。 變數的更新與覆寫 變數的值可以修改,也就是說,我們可以在程式的不同地方給同一個變數新的值。例如: x = 10 # x 最初被賦予 10 x = 15 # x 的值現在被更新為 15 這樣就能依照需求,在程式執行過程中靈活調整變數的值。 Python 的動態型別系統 Python 和某些靜態型別語言不同,定義變數時不需要宣告型別。賦值時,Python 會根據值自動判斷變數的型別。例如: x = 5 # x 是整數 x = 3.14 # x 變成浮點數 x = "Hi" # x 變成字串 同一個變數在程式執行過程中可以存放不同型別的值,這是 Python 的彈性之一。 常見資料型別 在 Python 中,資料型別決定我們可以對變數進行哪些操作...

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門 隨著人工智慧(AI)與深度學習(Deep Learning)快速發展,越來越多人對這些技術產生興趣。不論你是想踏入 AI 領域的初學者,還是已經有程式基礎的開發者,學好 Python 與深度學習框架(例如 PyTorch),都能為你打開更多可能。 為什麼選擇 Python? Python 已經是資料科學與人工智慧領域的首選語言。它的語法簡潔、容易上手,而且擁有龐大的生態系與大量開源函式庫。無論是資料處理、資料視覺化,還是建立機器學習與深度學習模型,Python 都能勝任。對想進入 AI 或資料科學領域的人來說,它幾乎是必備工具。 PyTorch 是什麼? PyTorch 是由 Meta(原 Facebook)AI 研究團隊開發的開源深度學習框架,以易用、靈活和動態計算圖著稱,是許多 AI 研究人員與開發者的首選。相較於其他框架,PyTorch 的寫法更貼近原生 Python,對初學者相對友善。無論是簡單的實驗,還是複雜的深度學習模型,PyTorch 都能提供強大的支援。 這個系列能帶給你什麼? 這個系列會從 Python 的基礎開始,帶你一步一步學習,最後能自己用 PyTorch 建立深度學習模型。即使你完全沒有寫過程式,也能跟著文章的節奏累積技能,理解 AI 與深度學習的核心觀念。 本系列涵蓋的主題 Python 基礎:從變數、條件判斷到函式與模組。 資料處理工具:用 NumPy 與 Pandas 有效率地操作資料。 資料視覺化:用 Matplotlib 與 Seaborn 把資料畫成圖表。 深度學習的數學基礎:線性代數、微積分與機率。 PyTorch 入門:理解張量、模型建構與 GPU 加速。 基礎深度學習模型:CNN 與 RNN 的實作應用。 深度學習專案實戰:從資料前處理到模型部署的端到端流程。 誰適合這個系列? 程式初學者 :如果你對 AI 充滿好奇,卻還沒寫過程式,系列的第一部分會帶你快速上手 Python,並幫助你理解深度學習的基本觀念。 資料科學愛好者 :如果你已經熟悉一些資料處理方法,進階部分會教你如何用 PyTorch 建構深度學習模型。 開發者與研究人員 :想更深入了...

Day 1 Python 簡介與環境設定

Day 1 Python 簡介與環境設定 引言 在現在的科技環境裡,程式設計已經是一項重要技能。無論你是對資料科學有興趣、想成為開發者,或是想踏入人工智慧(AI)領域,學會寫程式都能明顯提升你的競爭力。在眾多程式語言中,Python 因為語法簡單、功能強大、應用範圍廣泛,成為許多人進入程式世界的第一選擇。這篇文章會帶你認識 Python 的背景與優勢,並一步步教你在不同系統上安裝與設定 Python 開發環境,最後寫出第一支 Python 程式。 為什麼選擇 Python? Python 是一種高階程式語言,由 Guido van Rossum 在 1991 年發布。Python 的設計哲學強調程式碼的可讀性,並用縮排來定義程式區塊,這點和許多使用大括號的語言不同。簡潔的語法讓它成為初學者的理想選擇;就算是經驗豐富的開發者,也能用它完成複雜的專案。 Python 的優勢如下: 簡單易學 :Python 的語法清楚、結構簡潔,初學者很快就能上手。和其他語言相比,學習曲線相對平緩,不需要先弄懂一堆複雜觀念,就能開始寫程式。 應用範圍廣泛 :從資料科學、網頁開發、人工智慧、機器學習、自動化測試到網路爬蟲,Python 都有大量開源函式庫與工具支援,而且在這些領域都扮演關鍵角色。 豐富的函式庫與框架 :Python 的函式庫生態系非常龐大。做資料分析有 NumPy、Pandas;開發網站有 Django、Flask;做深度學習有 TensorFlow、PyTorch。各種需求幾乎都能找到對應的套件,讓開發更有效率。 跨平台支援 :Python 支援 Windows、macOS、Linux 等作業系統,程式通常不需要太多修改就能跨平台執行,讓開發與部署更有彈性。 活躍的社群 :Python 擁有龐大的開發者社群。學習或開發上遇到問題,幾乎都能在社群與論壇(例如 Stack Overflow)找到答案,對初學者來說是很強的後盾,也能減少卡關時的挫折感。 Python 的應用領域 Python 的流行與強大功能,讓許多領域都開始大量使用它。以下是幾個常見的應用方向: 資料科學 :隨著大數據與人工智慧興起,資料科學大量使用 Python。NumPy、Pandas 與 Matplotlib 等工具能處理和分析龐...