CodeSprout程式萌芽

CHAPTER 08 · PYTHON FOUNDATIONS

Module (模組)

認識 import 與標準函式庫,用現成工具處理數學、統計、JSON 與日期。

這一章學會
  • 理解模組、import 與命名空間
  • 使用 math、statistics、json、datetime
  • 認識自訂模組與本站執行環境的差別
先預測結果,再看輸出。

這裡的範例是可在 Python 3 執行的獨立小程式;輸出框是預先核對的結果。題庫作答時,請保留題目提供的 solve 與參數,使用 return 交回答案。模組章的雙檔範例會另外標明操作方式。

01|模組把相關功能整理在一起

模組是可以匯入的程式單位;一般自訂模組常是一個 .py 檔案。Python 的標準函式庫提供許多常用功能,使用前先 import,再用模組名稱.功能名稱呼叫,讀程式時就知道功能從哪裡來。

PYTHON程式碼
import math

print(math.sqrt(81))
print(math.isqrt(20))
預期輸出
9.0
4

02|三種常見的匯入寫法

import math 保留模組前綴,最適合初學時辨認來源;from math import ceil 只引入指定名稱;as 可以取別名。避免 from module import *,因為很難一眼看出名稱來源,也容易和自己的變數衝突。

PYTHON程式碼
import math as m
from math import ceil

print(m.floor(4.8))
print(ceil(4.2))
print(m.gcd(18, 24))
預期輸出
4
5
6

03|math:先確認輸入與回傳型態

math 提供向下取整 floor、向上取整 ceil、最大公因數 gcd 等功能。選工具之前先確認輸入是否在允許範圍。遇到需要精確整數判斷的題目,優先用整數工具,避免不必要的浮點轉換。

PYTHON程式碼
import math

length = 17
piece = 5
print(math.ceil(length / piece))
print(math.floor(-2.1))
print(math.isqrt(49) ** 2 == 49)
預期輸出
4
-3
True

04|statistics:平均數與中位數

mean 是平均數;median 是排序後的中間位置,偶數筆時取中間兩筆的平均。兩者描述資料的角度不同。一般呼叫需要非空資料;先判斷空清單要如何處理,不要直接把例子套到所有輸入。

PYTHON程式碼
import statistics

values = [2, 4, 8, 10]
print(statistics.mean(values))
print(statistics.median(values))
print(statistics.median([1, 3, 100]))
預期輸出
6
6.0
3

05|json:文字與 Python 資料互轉

JSON 是交換資料的文字格式。json.loads 把 JSON 字串轉成 Python 的字典、清單等資料;json.dumps 把 Python 資料轉成 JSON 文字。loads 的 s 可以聯想成 string;這裡不需要開檔,也不會連線。

PYTHON程式碼
import json

text = '{"name": "小芽", "done": false, "scores": [3, 5]}'
record = json.loads(text)
print(record["done"])
record["done"] = True
print(json.dumps(record, ensure_ascii=False))
預期輸出
False
{"name": "小芽", "done": true, "scores": [3, 5]}

06|datetime:把日期當日期處理

日期不是普通數字,也不適合直接對文字加 1。date 表示年月日,timedelta 表示一段時間;相減得到時間差。練習使用固定日期,結果就不會每天改變,也不需要時區或即時網路資料。

PYTHON程式碼
from datetime import date, timedelta

start = date(2024, 2, 28)
after_two_days = start + timedelta(days=2)
print(after_two_days.isoformat())
print((date(2024, 3, 3) - start).days)
print(date.fromisoformat("2025-01-15").month)
預期輸出
2024-03-01
4
1

07|自訂模組:兩個檔案合作

在自己的電腦上,可以把重複用到的函式存成 price_tools.py,另一個 main.py 再匯入。這是兩個檔案,不是把下面全部貼進同一個檔案。執行 main.py 時,Python 會尋找同一目錄中的 price_tools。

本站題庫是單一程式編輯區,沒有上傳自訂模組檔案的功能。本站作答時把 helper 與 solve 放在同一份程式即可;下例用來理解本機專案如何拆檔。

PYTHON · 本機雙檔示範程式碼
# 檔案一:price_tools.py
def total(price, quantity):
    return price * quantity

# 檔案二:main.py(與 price_tools.py 放在同一目錄)
import price_tools

print(price_tools.total(10, 3))
預期輸出
30

08|可以 import,不代表什麼功能都能使用

模組會受到執行環境限制。本站試跑在瀏覽器的隔離 Python 環境中,題目使用可離線運作的標準功能;不需安裝套件、連外查詢、讀取你的電腦檔案,或輸入密鑰。若想了解某個函式,先看官方文件的參數、回傳值與錯誤情況,再用小資料試一次。

  • import 成功後,仍要選對模組裡的函式。
  • 第三方套件與標準模組不同,本課不需要執行 pip install。
  • 模組題的 solve 仍要回傳題目要求的基本資料,不回傳 module 或日期物件本身;日期可依題意轉為文字。

WHEN SOMETHING GOES WRONG

遇到錯誤,先檢查這裡

import math 後直接寫 sqrt

只匯入模組時,要寫 math.sqrt。若用 from math import sqrt,才會直接得到 sqrt 這個名稱。

混淆 JSON 字串與字典

字串要先 loads 才能用鍵取資料;dict 本身則不需要 loads。先用 type 檢查手上的資料。

用今天日期作為固定測資

結果會隨日期變動。題庫要使用傳入的日期或明確固定日期,才有一致且可重現的結果。

PAUSE AND TRY

先不要急著看別人的寫法

  1. 對 [1, 2, 3, 4, 100] 比較平均數和中位數,解釋它們為什麼差很多。
  2. 將 JSON 的 done 改為 null,loads 後會得到哪一種 Python 值?
  3. 用 date 與 timedelta 找出 2024-12-31 的隔天,不自己處理月份進位。

先用紙筆預測,再改動範例中的數字或文字。結果與預期不同時,找出最早開始不同的那一步。

把這幾件事帶走

  • 先 import,再用明確的名稱呼叫功能。
  • 看清楚輸入限制、回傳型態與例外。
  • 模組幫你整理工具;solve 仍負責交回題目需要的結果。

FROM READING TO PRACTICE

用三道免費題,練習本章觀念

先做簡單題確認語法,再把幾個步驟組合起來。三題都來自本章主題的新版免費題庫,難度表示需要組合的基本概念。

延伸閱讀:Python 官方文件

以下是本章查證使用的官方資料。可以先完成入門練習,再回來查閱更完整的參數與說明。