寫到現在,我們的程式越來越長、越來越複雜。
你是不是也遇過這種情況:
上次寫過一個很棒的 BMI 計算函式,
結果過幾天另一個專案又要用,
你複製貼上、修改一點,兩邊各自成長、最後難以維護。
這就是傳說中的——複製地獄。(好累QQ)
Python 給了我們一個優雅的解法:模組(Module)與套件(Package)
模組:像是一個「功能零件」
套件:是「零件的收納盒」
學會這兩者,你就能讓程式變得像樂高一樣:能拆、能組、能重用。
模組就是一個 .py 檔案。
裡面可以放函式、變數、類別。
任何你寫的 Python 檔案,本身就是一個模組。
import math
print(math.sqrt(16)) # 開根號
print(math.pi) # 圓周率
說明:
使用模組時要加上「模組名稱.函式名稱」!
輸出:
from math import sqrt, pi
print(sqrt(25))
print(pi)
from ... import ... 的意思是:
「我只要這幾樣東西,不用整包都拿來。」
這樣可以減少記憶體使用,也讓程式更精簡!
import random as r
print(r.randint(1, 10))
說明:
as 後面可以幫模組取一個綽號,通常會比較簡短的!
就像朋友一樣叫綽號就好,不用每次講全名。
輸出:
math模組主要提供進階數學運算的函式。
ceil(x)
— 無條件進位取「比 x 大」的最小整數(天花板函式)。
import math
print(math.ceil(3.2)) # 4
print(math.ceil(-3.2)) # -3
💡小技巧:
可用於計算「頁數」、「分組數」等情境,例如要讓 17 個人每組最多 5 人
floor(x)
— 無條件捨去取「比 x 小」的最大整數(地板函式)。
print(math.floor(3.9)) # 3
print(math.floor(-3.9)) # -4
fabs(x)
— 絕對值(float 版本)與內建 abs()
類似,不同之處是:
math.fabs()
一定回傳浮點數,而 abs()
會根據輸入型別回傳 int 或 float。
print(math.fabs(-10)) # 10.0
print(abs(-10)) # 10
gcd(x, y)
— 最大公因數返回兩個數字的最大公因數(Greatest Common Divisor)。
print(math.gcd(24, 36)) # 12
print(math.gcd(10, 15)) # 5
可搭配 lcm()
(Python 3.9)找最小公倍數:
print(math.lcm(4, 6)) # 12
sqrt(x)
— 平方根回傳 x 的平方根(只支援非負數)。
print(math.sqrt(9)) # 3.0
print(math.sqrt(2)) # 1.4142135623730951
sin(x)
、cos(x)
、tan(x)
— 三角函式回傳弧度(radian)為單位的正弦、餘弦、正切值。
print(math.sin(math.pi/2)) # 1.0
print(math.cos(0)) # 1.0
print(math.tan(math.pi/4)) # 1.0
函式 | 功能 |
---|---|
pow(x, y) |
回傳 x 的 y 次方(等同於 x ** y ) |
exp(x) |
e 的 x 次方(指數函式) |
log(x) |
以 e 為底的對數 |
log10(x) |
以 10 為底的對數 |
factorial(x) |
階乘(x!) |
modf(x) |
拆分小數與整數部分,回傳 tuple |
import math
print("請輸入直角三角形兩邊長:")
x=float(input("請輸入底邊長"))
y=float(input("請輸入高邊長"))
z=math.sqrt(x**2+y**2)
print("斜邊長:",z)
輸出:
random模組用來「產生隨機數」或「隨機選擇資料」,
在遊戲、模擬、抽獎、亂數密碼產生器中都超常見!!
使用前記得先匯入:
import random
一起來看看用途以及語法吧:
random.randint(a, b)
回傳「整數」亂數,範圍包含 a
和 b
。
import random
print(random.randint(1, 6)) # 模擬擲骰子:可能輸出 1~6
輸出:(每一次執行結果都會不一樣喔!)
random.random()
回傳一個「0~1 之間的浮點數」,不包含 1。
print(random.random())
輸出:
random.uniform(a, b)
產生「a 到 b 之間」的隨機小數。
print(random.uniform(10, 20))
輸出:(隨機印出10到20之間的小數)
random.choice(sequence)
從「序列(list、tuple、string)」中隨機取出一個元素。
fruits = ["apple", "banana", "cherry"]
print(random.choice(fruits))
輸出:
random.choices(sequence, k=n)
一次取出「多個」元素(可重複)。
colors = ["red", "blue", "green"]
print(random.choices(colors, k=3))
輸出:
random.sample(sequence, k=n)
隨機取出「不重複」的元素。
numbers = [1, 2, 3, 4, 5]
print(random.sample(numbers, 3))
輸出:
random.shuffle(list)
將清單的順序「就地洗牌」。
cards = ["A", "K", "Q", "J"]
random.shuffle(cards)
print(cards) # 例如:['J', 'A', 'K', 'Q']
輸出:
import random
participants = ["Alice", "Bob", "Charlie", "David", "Eve"]
print("🎉 抽獎開始!")
winners = random.sample(participants, 2) # 抽出2位不重複得獎者
print(f"得獎者是:{winners[0]} 和 {winners[1]}!")
輸出:
import random
answer = random.randint(1, 10)
print("🎯 猜數字遊戲開始!(範圍 1~10)")
while True:
guess = int(input("請輸入你的猜測:"))
if guess > answer:
print("太大了!")
elif guess < answer:
print("太小了!")
else:
print(f"🎉 恭喜答對!答案是 {answer}")
break
輸出:
sys
模組:掌控 Python 系統資訊sys
(System)模組負責和「Python 執行環境」對話。
想知道你的 Python 版本?或是讓程式中途退出?
通通找它就對了!
常用語法與範例:
import sys
print(sys.version) # 顯示 Python 版本
print(sys.platform) # 顯示作業系統平台
# 提前結束程式
sys.exit("程式中止,結束執行。")
sys.version
→ 確認環境是否符合版本需求。sys.platform
→ 檢查程式運行於哪個系統(Windows / macOS / Linux)。sys.exit()
→ 提前結束執行,常用於錯誤檢查或安全中止。⚠️ 新手常見錯誤:
sys.exit()
不會顯示錯誤,它只是「正常離開」,
如果你要顯示訊息,可以在括號裡加字串。
os
模組:與作業系統對話os
(Operating System)模組是 Python 與電腦「溝通」的橋樑。
可以用它建立資料夾、列出檔案、刪除檔案,或取得目前工作路徑。
import os
print(os.getcwd()) # 顯示目前工作目錄
os.mkdir("test_folder") # 建立新資料夾
print(os.listdir()) # 顯示資料夾內所有檔案
os.rename("test_folder", "my_folder") # 重新命名資料夾
os.remove("old_file.txt") # 刪除檔案(小心使用!)
os.getcwd()
→ 顯示目前 Python 執行位置。os.listdir()
→ 查看資料夾內容。os.mkdir()
/ os.rename()
/ os.remove()
→ 操作檔案與資料夾。⚠️ 新手常見錯誤:
執行 os.remove()
或 os.rmdir()
前一定要確認路徑存在,否則會噴錯!
可以先用 os.path.exists("路徑")
來檢查。
shutil
模組:搬家與複製專家shutil
是「檔案處理模組」的進階版,
可以幫你搬移、複製、整包壓縮,處理整個資料夾非常方便。
import shutil
# 複製單一檔案
shutil.copy("data.txt", "backup.txt")
# 搬移檔案
shutil.move("backup.txt", "backup_folder/backup.txt")
# 壓縮資料夾
shutil.make_archive("my_backup", "zip", "backup_folder")
shutil.copy(src, dst)
→ 複製檔案。shutil.move(src, dst)
→ 搬移檔案或資料夾。shutil.make_archive(name, format, root_dir)
→ 將整個資料夾打包成壓縮檔。datetime
模組:掌控時間與日期處理時間的模組就是 datetime
,
它能取得今天的日期、現在的時間,還能計算日期差距。
from datetime import datetime, timedelta
# 取得現在時間
now = datetime.now()
print("現在時間:", now)
# 格式化顯示
print("格式化輸出:", now.strftime("%Y-%m-%d %H:%M:%S"))
# 計算日期差
tomorrow = now + timedelta(days=1)
print("明天是:", tomorrow.strftime("%Y-%m-%d"))
輸出:
用途說明:
datetime.now()
→ 取得目前時間。strftime()
→ 格式化輸出時間(%Y 年、%m 月、%d 日)。timedelta(days=1)
→ 做日期加減。走到今天,大家應該有一種「程式越來越像積木」的感覺。
以前寫程式,我們常常一股腦把所有功能塞進同一支檔案裡,
結果改一行、壞一片,debug 到懷疑人生。
但今天我們學到的「模組與套件」,
其實就是讓程式「有組織、有分工」的關鍵!!
模組(module)就像是功能零件,
每個 .py 檔都能被重複使用。
而套件(package)則是收納盒,
讓你把零件分類整理起來,誰都能方便使用。
再加上 math、random、sys、os、shutil、datetime 這些標準模組,
你會發現 Python 幾乎可以處理所有日常任務:
從算數學、產生亂數、控制系統、備份資料、到掌控時間,全部一手包辦。
老實說,走到 Day24,我真的能感受到每天撰稿的累積。
從一開始每天寫文章都卡半天(雖然每天都還是花很久的時間),
但感覺就像是在寫日記、已經快變成一種習慣了!(畢竟養成一個習慣需要21天)
這 24 天的筆記也在讓我的思考變得更有系統!!
明天,我們要進入最後衝刺的階段,
繼續堅持,我們快到終點了!!(也跟自己打氣一下!)
那麼我們就明天見囉~