第 16 課 · 進階 · 18 分鐘

Python 模組與匯入

復用已經寫好的程式碼,而不是重新造一遍。

import 語法模組命名空間標準函式庫

Maya 要在牛奶標籤上打明天的日期,還想算一個分小費的平方根。標準函式庫兩樣都有,她卻一直在手寫。import 到底把什麼帶進了這個檔案?

模組就是一個可以復用的 Python 程式碼檔案。標準函式庫隨 Python 一起安裝,涵蓋數學、統計、隨機數、日期等大量功能。import 會讓這些名字在你的程式裡可用。 你還會看到匯入快取、顯式命名空間和主程式入口保護。

匯入整個模組

import math 會載入模組,並把它的名字放在 math 命名空間裡。呼叫 math.sqrt 而不是直接寫 sqrt,讀者能看出函式來自哪裡,也不容易和自己的變數重名。

import math
print(math.sqrt(81))
print(math.pi)

名字留在模組裡

只匯入需要的名字

from statistics import mean 會把一個名字帶入目前命名空間。名字含義明確時,這種寫法很簡潔。實際程式碼中避免 from module import *:它會隱藏名字的來源,還可能覆蓋已有變數。

from statistics import mean, median
scores = [7, 9, 10]
print(mean(scores))
print(median(scores))

有針對性的匯入

別名與 random 模組

模組名很長,或社區有約定俗成的短名時,可以用別名。import random as rnd 仍然載入整個模組,只是通過 rnd 存取。需要重複執行時,先給隨機數生成器設定種子。

import random as rnd
rnd.seed(7)
print(rnd.choice(["latte", "tea", "mocha"]))

簡短的別名

匯入會被快取

Python 每個行程只載入一次模組,並把它存進 sys.modules。第二次 import 綁定的是同一個模組物件,不會重新執行檔案。這既解釋了模組級狀態為何共用,也說明昂貴初始化該放進函式或主程式入口保護。

import math
import math as m
import sys
print(math is m)
print("math" in sys.modules)
print(math.sqrt(16))

別名指向同一個模組物件

顯式命名空間避免重名

import statistics 會把 mean 留在模組命名空間裡,本機變數 mean 不會覆蓋它。from statistics import mean 更短,但會把名字放進目前命名空間。選擇能讓名字來源更清楚的那種寫法。

import statistics
mean = 10
print(mean)
print(statistics.mean([1, 2, 3]))

本機變數不會覆蓋模組

主程式入口保護把匯入和執行分開

檔案被直接執行時,__name__ 是 __main__;被匯入時,__name__ 是模組名。把示範或命令列入口放進 if __name__ == "__main__":,匯入時就只會定義名字,不會啟動程式。

def main():
    print("program starting")

if __name__ == "__main__":
    main()
print("module name:", __name__)

匯入不應該啟動程式

本課要點

  • import module 會把名字保留在模組命名空間中。
  • from module import name 會把一個名字帶入目前檔案。
  • 別名改變的是存取方式,不是模組本身。
  • 優先使用明確的匯入,而不是通配符匯入。
  • 匯入會快取;主程式入口保護避免匯入時產生副作用。

常見錯誤

  • 沒有匯入就直接呼叫 sqrt,或忘記寫 math. 前綴。
  • 使用 from math import *,導致看不清名字來源。
  • 沒有設定種子,卻以為 random 每次都會給出相同結果。
  • 在模組匯入時直接執行報告,讓每個呼叫方都意外執行。
輪到你

匯入 math 和 statistics,列印 16 的平方根以及 [2, 4, 6] 的平平均值。

動手試試

改改變數、先預測輸出,再執行程式碼。第一次點擊「執行程式碼」時會下載 Python 執行時,可能需要幾秒鐘。

瀏覽器內 Python本機執行 · 無需帳號
首次執行會從 CDN 下載 Pyodide。修改後點擊「執行程式碼」。

練習本課

12 道題,作答後立即看到解釋。

查看 12 道題答案開始練習
← 類與物件巢狀資料 →