在編程的過程中,總會有出現 "咦?" 的驚嘆時刻。這些被稱為 'Pythonic' 的程式碼,能如此簡潔而優雅地處理複雜的邏輯。

今天,我們將介紹三個簡單卻強大的 Pythonic 程式碼片段,讓我們一起感動吧。


1. 前綴(Prefix)切片:在'動態'時展現真正的價值



當您需要從文件路徑中去掉基本路徑並僅獲取相對路徑時,可以將 len()字符串切片(slicing) 組合使用。

# 示例 1
prefix = "/var/data/user/files"
p = "/var/data/user/files/report.txt"

if p.startswith(prefix):
    relative_path = p[len(prefix):]
    print(relative_path) 
    # /report.txt

到這裡看起來和 p[22:](直接寫數字 22)並沒有什麼區別。但這段程式碼的 真正價值 在於 前綴動態變化時 的表現。

✅ The Pythonic Way (價值展現)

想像一下,您需要處理多個用戶的數據路徑。

def get_relative_path(full_path, user_name):
    # ⭐️ 前綴根據 user_name 動態變化!
    prefix = f"/var/data/{user_name}/files"

    if full_path.startswith(prefix):
        # 每次都準確計算動態長度。
        # user1 是 22,long_user 是 29...
        return full_path[len(prefix):]

    return full_path

# 'user1'(前綴長度 22)
path1 = "/var/data/user1/files/report.txt"
print(f"user1: {get_relative_path(path1, 'user1')}")

# 'long_user_name_2'(前綴長度 29)
path2 = "/var/data/long_user_name_2/files/document.pdf"
print(f"user2: {get_relative_path(path2, 'long_user_name_2')}")

結果:

user1: /report.txt
user2: /document.pdf

😲 感動點

這段程式碼不依賴於前綴的 _內容_ 或 _固定長度_。它僅根據 len() 實時計算的長度 進行 [N:] 切片。

這與像 p[22:] 這樣的硬編碼截然不同,展現了 更高的可維護性和穩固的程式碼


2. 無需臨時變數的 '魔法交換'

當需要交換兩個變量的值時,不需要臨時變數 temp

✅ The Pythonic Way

a = 10
b = 20

# 用 Python 的方式交換
    a, b = b, a

print(f"a = {a}, b = {b}") 
# a = 20, b = 10

😲 感動點

這是利用 元組打包(Packing)和解包(Unpacking) 實現的。

  1. b, a : 等號右側的 (20, 10) 值被臨時元組打包

  2. a, b = ... : 此元組的值依次解包給左側的 ab 變量。

'將 a 和 b 互換'的 意圖直接反映在程式碼中


3. 將 for 迴圈寫成一行:'理解'的魔法



'我想用某些數據,僅選擇符合特定條件的元素,變形後創建一個新的集合。'

這長句常常會被翻譯成 4~5 行的 for 迴圈。Python 將此過程壓縮為一行。

字典:反轉鍵值

變量交換的驚喜在字典中也延續。當您需要遍歷 for 迴圈將 k:v 變為 v:k 時。

# 傳統方法
my_dict = {'name': 'Alice', 'job': 'Engineer'}
inverted_dict = {}
for k, v in my_dict.items():
    inverted_dict[v] = k

✅ The Pythonic Way (字典理解)

my_dict = {'name': 'Alice', 'job': 'Engineer'}

# "從 my_dict 提取 k,v,創建新的 v:k 對的字典"
inverted_dict = {v: k for k, v in my_dict.items()}

print(inverted_dict)
# {'Alice': 'name', 'Engineer': 'job'}

(不過,這種方式對 Value 有唯一性限制。)

列表:根據條件生成新的列表

這種魔法在列表中使用得更頻繁。讓我們創建一個新的列表,只包含 0 到 9 的偶數並進行平方。

# 傳統方法
squares_of_evens = []
for i in range(10):
    if i % 2 == 0:
        squares_of_evens.append(i * i)

✅ The Pythonic Way (列表理解)

# "迴圈遍歷 i 從 0 到 9(if), 如果 i 是偶數,就創建 i*i 的列表"
squares_of_evens = [i * i for i in range(10) if i % 2 == 0]

print(squares_of_evens)
# [0, 4, 16, 36, 64]

😲 感動點

理解讓程式碼不再冗長地解釋 '怎麼去做'(如何:宣告空列表、迴圈、append...),而是改成宣告 '想要什麼'(what)


結論:當程式碼帶來感動時

今天我們看到的三個片段,並不僅僅是簡單的 '編程技巧'。

這顯示了 「如何更清晰、更簡潔、更美麗地表達我的意圖?」 的 Python 哲學(The Zen of Python)。

程式碼不僅僅是為機器提供的命令,而是能包含 開發者的思想的 '文章',而且就像寫好文章能帶來感動,寫得好的程式碼同樣能帶給我們 '咦?' 的感動。

希望你們的程式碼中也充滿這樣的 'Pythonic 感動'。