iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0

前言

寫到現在,我們的程式越來越長、越來越複雜。
你是不是也遇過這種情況:

上次寫過一個很棒的 BMI 計算函式,
結果過幾天另一個專案又要用,
你複製貼上、修改一點,兩邊各自成長、最後難以維護。

這就是傳說中的——複製地獄。(好累QQ)

Python 給了我們一個優雅的解法:模組(Module)與套件(Package)

模組:像是一個「功能零件」
套件:是「零件的收納盒」

學會這兩者,你就能讓程式變得像樂高一樣:能拆、能組、能重用。

ㄧ、模組(Module)是什麼?

模組就是一個 .py 檔案。
裡面可以放函式、變數、類別。
任何你寫的 Python 檔案,本身就是一個模組。

匯入模組的三種方式

1.匯入整個模組

import math

print(math.sqrt(16))   # 開根號
print(math.pi)         # 圓周率

說明:
使用模組時要加上「模組名稱.函式名稱」!

輸出:
https://ithelp.ithome.com.tw/upload/images/20251008/20164721FU6jIWJ7d2.png

2.匯入模組的部分功能

from math import sqrt, pi

print(sqrt(25))
print(pi)

from ... import ... 的意思是:

「我只要這幾樣東西,不用整包都拿來。」

這樣可以減少記憶體使用,也讓程式更精簡!

3.匯入並取別名

import random as r

print(r.randint(1, 10))

說明:

as 後面可以幫模組取一個綽號,通常會比較簡短的!
就像朋友一樣叫綽號就好,不用每次講全名。

輸出:

https://ithelp.ithome.com.tw/upload/images/20251008/20164721mYd1bj33tj.png

二、常見模組:math數學模組

math模組主要提供進階數學運算的函式。

1.ceil(x) — 無條件進位

取「比 x 大」的最小整數(天花板函式)。

import math
print(math.ceil(3.2))   # 4
print(math.ceil(-3.2))  # -3

💡小技巧:

可用於計算「頁數」、「分組數」等情境,例如要讓 17 個人每組最多 5 人

2.floor(x) — 無條件捨去

取「比 x 小」的最大整數(地板函式)。

print(math.floor(3.9))   # 3
print(math.floor(-3.9))  # -4

3.fabs(x) — 絕對值(float 版本)

與內建 abs() 類似,不同之處是:

math.fabs() 一定回傳浮點數,而 abs() 會根據輸入型別回傳 int 或 float。

print(math.fabs(-10))   # 10.0
print(abs(-10))         # 10

4.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

5. sqrt(x) — 平方根

回傳 x 的平方根(只支援非負數)。

print(math.sqrt(9))    # 3.0
print(math.sqrt(2))    # 1.4142135623730951

6.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

7.其他常見函式補充:

函式 功能
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)

輸出:
https://ithelp.ithome.com.tw/upload/images/20251008/20164721Hkr2X1SKKI.png

三、常見模組:random隨機模組

random模組用來「產生隨機數」或「隨機選擇資料」,
在遊戲、模擬、抽獎、亂數密碼產生器中都超常見!!

使用前記得先匯入:

import random

一起來看看用途以及語法吧:

1.產生隨機整數與小數

(1)random.randint(a, b)

回傳「整數」亂數,範圍包含 ab

import random
print(random.randint(1, 6))  # 模擬擲骰子:可能輸出 1~6

輸出:(每一次執行結果都會不一樣喔!)
https://ithelp.ithome.com.tw/upload/images/20251008/20164721YLjyxE6XCU.png

(2)random.random()

回傳一個「0~1 之間的浮點數」,不包含 1。

print(random.random())  

輸出:
https://ithelp.ithome.com.tw/upload/images/20251008/2016472170adrNXC46.png

(3)random.uniform(a, b)

產生「a 到 b 之間」的隨機小數。

print(random.uniform(10, 20))  

輸出:(隨機印出10到20之間的小數)

https://ithelp.ithome.com.tw/upload/images/20251008/2016472116WtGBP3GC.png

2.隨機抽樣與選取

(1) random.choice(sequence)

從「序列(list、tuple、string)」中隨機取出一個元素。

fruits = ["apple", "banana", "cherry"]
print(random.choice(fruits)) 

輸出:
https://ithelp.ithome.com.tw/upload/images/20251008/20164721leKbAvs64u.png

(2) random.choices(sequence, k=n)

一次取出「多個」元素(可重複)。

colors = ["red", "blue", "green"]
print(random.choices(colors, k=3))  

輸出:
https://ithelp.ithome.com.tw/upload/images/20251008/20164721XoziFbm0vl.png

(3) random.sample(sequence, k=n)

隨機取出「不重複」的元素。

numbers = [1, 2, 3, 4, 5]
print(random.sample(numbers, 3))  

輸出:

https://ithelp.ithome.com.tw/upload/images/20251008/20164721NKNdXVb45n.png

(4) random.shuffle(list)

將清單的順序「就地洗牌」。

cards = ["A", "K", "Q", "J"]
random.shuffle(cards)
print(cards)  # 例如:['J', 'A', 'K', 'Q']

輸出:
https://ithelp.ithome.com.tw/upload/images/20251008/20164721uTNNGTtOn0.png

牛刀小試1:抽獎程式

import random

participants = ["Alice", "Bob", "Charlie", "David", "Eve"]

print("🎉 抽獎開始!")

winners = random.sample(participants, 2)  # 抽出2位不重複得獎者
print(f"得獎者是:{winners[0]} 和 {winners[1]}!")

輸出:
https://ithelp.ithome.com.tw/upload/images/20251008/20164721GIyqZH3BPL.png

牛刀小試2:猜數字遊戲

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

輸出:

https://ithelp.ithome.com.tw/upload/images/20251008/20164721eRR7JQymgJ.png

四、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"))

輸出:

https://ithelp.ithome.com.tw/upload/images/20251008/20164721NO6vddiVn5.png

用途說明:

  • datetime.now() → 取得目前時間。
  • strftime() → 格式化輸出時間(%Y 年、%m 月、%d 日)。
  • timedelta(days=1) → 做日期加減。

結語

走到今天,大家應該有一種「程式越來越像積木」的感覺。

以前寫程式,我們常常一股腦把所有功能塞進同一支檔案裡,
結果改一行、壞一片,debug 到懷疑人生。

但今天我們學到的「模組與套件」,
其實就是讓程式「有組織、有分工」的關鍵!!

模組(module)就像是功能零件,
每個 .py 檔都能被重複使用。
而套件(package)則是收納盒,
讓你把零件分類整理起來,誰都能方便使用。

再加上 math、random、sys、os、shutil、datetime 這些標準模組,
你會發現 Python 幾乎可以處理所有日常任務:
從算數學、產生亂數、控制系統、備份資料、到掌控時間,全部一手包辦。

老實說,走到 Day24,我真的能感受到每天撰稿的累積。
從一開始每天寫文章都卡半天(雖然每天都還是花很久的時間),
但感覺就像是在寫日記、已經快變成一種習慣了!(畢竟養成一個習慣需要21天)
這 24 天的筆記也在讓我的思考變得更有系統!!

明天,我們要進入最後衝刺的階段,
繼續堅持,我們快到終點了!!(也跟自己打氣一下!)

那麼我們就明天見囉~


上一篇
【Day23】物件再進化:多層繼承、多重繼承與私有方法
系列文
Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言