大家好。今天我們要來聊一個超級實用、但常被初學者忽略的魔法——Unpacking 與 Extended Iterable Unpacking。
如果你還不知道它們有多好用,那你一定會在看完這篇文章後忍不住想試一試這個神奇的unpacking語法。 XD
✨ 什麼是 Unpacking?
簡單講:把一個Python語言裡的可迭代容器、物件,像是list、tuple、dict、string…等等,把裡面的東西,一口氣一一對應分配給每一個等號左側的變數。就像你買了便當,打開後自動分成:
- 飯 →
rice - 肉 →
meat - 青菜 →
veggie
在Python ,我們就可以這樣寫:
rice, meat, veggie = ["白飯", "雞腿", "燙青菜"]
# 執行上面這一行之後,對應的結果為
# rice = 白飯
# meat = 雞腿
# veggie = 燙青菜
#
# 依照前後順序,一一對應分配給每一個等號(=)左側的變數,相當直覺!
🎉 Unpacking語法帶來哪些好處?
- 每個變數依照順序對應到內容
- 程式碼更乾淨
- 可讀性更高
- 更 Pythonic 的coding style
🐣 基本拆包:超nice入門款
🥚 例子:把三個數字拆給三個變數
a, b, c = (1, 2, 3)
# 執行結果
# a = 1
# b = 2
# c = 3
如果你把變數寫太多或太少…
Python也會在Error Message回報對應的錯誤訊息,
告訴你=左側的變數總數量對不上。
a, b = (1, 2, 3)
# ValueError: too many values to unpack
# 等號左側對應的變數數量太少,少了一個
a, b, c, d = 1, 2, 3
# ValueError: not enough values to unpack (expected 4, got 3)
# 等號左側對應的變數數量太多,多了一個
# 也可以說,等號右側待分配的數量太少,少了一個
🧙 進階拆包:
Extended Iterable Unpacking
真正讓你變魔法師的部分
這個feature從 Python 3 開始成為正式功能。
你可以在拆包時加入 *,讓某個變數接收「配對之後,剩餘的所有項目」。
🎩 基本示範:*rest 拿全部剩下的
head, *rest = [1, 2, 3, 4, 5]
# 執行結果
# head = 1
# rest = [2, 3, 4, 5]
🍱 多重變數拆包:自由度超高
first, *middle, last = [10, 20, 30, 40, 50]
# 執行結果
# first = 10
# middle = [20, 30, 40]
# last = 50
這在 log parser、串流資料處理、訊息格式解碼等情境非常實用。
🤫 Python unpacking
也支援dummy variable: _
有時候,你拆到一些你不 care 的資料(don't care item),可用 _ 來忽略。
a, _, c = (1, 2, 3)
# 執行結果
# a = 1
# _ = 2
# c = 3
當然,這裡也支援多變數拆包(Unpacking)
a, *_, c = [1, 2, 3, 4, 5]
# 執行結果
# a = 1
# _ = [2, 3, 4]
# c = 5
說到這,順便提供冷笑話一則~ XD
_ 表示:我又被忽略了……但我已經習慣了😢
🔥 高手級用法:多層拆包!
此外,Python 還支援多層次的巢狀拆包:
(a, b), (c, d) = [(1, 2), (3, 4)]
# 執行結果
# a = 1
# b = 2
# c = 3
# d = 4
同樣地,這裡也可以結合 extended unpacking:
(a, *rest), last = ([1, 2, 3, 4], 99)
# 執行結果
# a = 1
# rest = [2, 3, 4]
# last = 99
⚡ 用於交換變數:Python 經典一行!
傳統的變數交換,大家一定再熟悉不過了
temp = a;
a = b;
b = temp;
# a, b 交換值
用拆包的技巧,可以達成同樣的swap功能
a, b = b, a
# a, b 交換值
簡潔、有型、安全又Pythonic。
🐍 總結:
拆包技術就像 Python 世界的忍術卷軸
Unpacking 與 Extended Unpacking帶來幾個明顯的好處
- 語法更簡潔
- 可讀性夠高
- 在分配解析資料,或者交換變數時相當實用
- 更趨向Pythonic coding style











