🐍【Python 教學】超實用的拆包魔法: Unpacking

更新 發佈閱讀 6 分鐘

大家好。今天我們要來聊一個超級實用、但常被初學者忽略的魔法——Unpacking 與 Extended Iterable Unpacking

如果你還不知道它們有多好用,那你一定會在看完這篇文章後忍不住想試一試這個神奇的unpacking語法。 XD


✨ 什麼是 Unpacking?

簡單講:把一個Python語言裡的可迭代容器、物件,像是list、tuple、dict、string…等等,把裡面的東西,一口氣一一對應分配給每一個等號左側的變數。

就像你買了便當,打開後自動分成:

  • 飯 → rice
  • 肉 → meat
  • 青菜 → veggie

在Python ,我們就可以這樣寫:

rice, meat, veggie = ["白飯", "雞腿", "燙青菜"]

# 執行上面這一行之後,對應的結果為​
# rice = 白飯
# meat = 雞腿
# veggie = 燙青菜​
#
# 依照前後順序,一一對應分配給每一個等號(=)左側的變數,相當直覺!

🎉 Unpacking語法帶來哪些好處?

  1. 每個變數依照順序對應到內容
  2. 程式碼更乾淨
  3. 可讀性更高
  4. 更 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





留言
avatar-img
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
97會員
428內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2025/05/11
🎮 Python 2048 遊戲教學: 從零開始打造好玩的方塊消除遊戲! 哈囉,同學們!今天我們要一起用 Python 寫一個超經典的遊戲--2048! 而且這個遊戲可以直接在Command line(也就是命令提示字元、Console)玩!
Thumbnail
2025/05/11
🎮 Python 2048 遊戲教學: 從零開始打造好玩的方塊消除遊戲! 哈囉,同學們!今天我們要一起用 Python 寫一個超經典的遊戲--2048! 而且這個遊戲可以直接在Command line(也就是命令提示字元、Console)玩!
Thumbnail
2025/05/04
今天我們來學一個有趣的小專案: 自己用 Python 寫一個「剪刀、石頭、布」猜拳遊戲! 學完這個,你就不只是學程式設計, 還能順便和電腦玩幾把猜拳,重拾兒時回憶喔!😄
Thumbnail
2025/05/04
今天我們來學一個有趣的小專案: 自己用 Python 寫一個「剪刀、石頭、布」猜拳遊戲! 學完這個,你就不只是學程式設計, 還能順便和電腦玩幾把猜拳,重拾兒時回憶喔!😄
Thumbnail
2024/10/10
從Python 內建deque資料結構的角度切入, 同時了解deque 與 FIFO Queue相關的function用法。 collections.deque是一種兩端點皆可進出的雙端佇列 在兩端點高效地在O(1)常數時間內添加和刪除元素。 這使得deque非常適合實現FIFO Queue
Thumbnail
2024/10/10
從Python 內建deque資料結構的角度切入, 同時了解deque 與 FIFO Queue相關的function用法。 collections.deque是一種兩端點皆可進出的雙端佇列 在兩端點高效地在O(1)常數時間內添加和刪除元素。 這使得deque非常適合實現FIFO Queue
Thumbnail
看更多
你可能也想看
Thumbnail
試聞 Sunkronizo的香氛後,我才發現:原來不是我在挑香,而是香氣更早知道我是誰。原本以為自己最像溫柔的 1 號,真正試香後卻被成熟、冷靜的 3 號選中。其他七瓶香,也意外喚醒我生命中不同階段的八種角色。香氣讓我明白——人生不只直線前進,也能橫向展開,切換更多樣的自己。
Thumbnail
試聞 Sunkronizo的香氛後,我才發現:原來不是我在挑香,而是香氣更早知道我是誰。原本以為自己最像溫柔的 1 號,真正試香後卻被成熟、冷靜的 3 號選中。其他七瓶香,也意外喚醒我生命中不同階段的八種角色。香氣讓我明白——人生不只直線前進,也能橫向展開,切換更多樣的自己。
Thumbnail
進入選擇敘述語法了。常用的選擇敘述語法,弄懂了就運用自如。
Thumbnail
進入選擇敘述語法了。常用的選擇敘述語法,弄懂了就運用自如。
Thumbnail
這題開始,用到import了。使用模組中的內建函數,真的很省時又方便。
Thumbnail
這題開始,用到import了。使用模組中的內建函數,真的很省時又方便。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News