2024年11月27日 星期三

Python 標準庫中好用的工具

 

Python 標準庫中好用的工具

1. namedtuple

  • 用途:可以建立具名稱的元組,類似簡單的資料類型,提供可讀性高的結構。
  • 模組collections
  • 特性:具備鍵值存取能力,並保持元組的不可變特性。
from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
p = Point(10, 20)
print(p.x, p.y)  # 10 20


2. Counter

  • 用途:統計元素的次數。
  • 模組collections
  • 特性:支援加法、減法等操作,常用於快速統計字符或數字出現的頻率。
from collections import Counter

text = "defaultdict and deque are useful"
counter = Counter(text.split())
print(counter)  # Counter({'defaultdict': 1, 'and': 1, 'deque': 1, 'are': 1, 'useful': 1})


3. OrderedDict

  • 用途:保留字典鍵值對的插入順序。
  • 模組collections
  • 特性:在需要順序敏感的場景中非常有用,例如序列化或輸出格式控制。
from collections import OrderedDict

od = OrderedDict()
od["a"] = 1
od["b"] = 2
od["c"] = 3
print(od)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])


4. defaultdict

  • 用途:為未定義的鍵提供默認值,避免 KeyError。
  • 模組collections
  • 特性:適用於分組、計數等情境,已詳述於前文。

5. deque

  • 用途:高效的雙端佇列操作。
  • 模組collections
  • 特性:支援 O(1) 的左右插入與刪除,適用於滑動窗口等操作。
from collections import deque

d = deque([1, 2, 3])
d.append(4)  # 右側插入
d.appendleft(0)  # 左側插入
print(d)  # deque([0, 1, 2, 3, 4])


6. heapq

  • 用途:處理最小堆(Min-Heap)和最大堆(Max-Heap)。
  • 模組heapq
  • 特性:用於快速取出最小值(或最大值),適合處理優先佇列和排序相關問題。
import heapq

nums = [5, 1, 8, 3]
heapq.heapify(nums)  # 將列表轉為最小堆
print(nums)  # [1, 3, 8, 5]
print(heapq.heappop(nums))  # 1


7. itertools

  • 用途:提供高效的迭代器工具。
  • 模組itertools
  • 常用工具
    • combinations:計算組合。
    • permutations:計算排列。
    • product:計算笛卡兒積。
from itertools import combinations

data = [1, 2, 3]
print(list(combinations(data, 2)))  # [(1, 2), (1, 3), (2, 3)]


8. functools.lru_cache

  • 用途:記憶化函數結果,提升重複計算效率。
  • 模組functools
  • 特性:適用於需要快速重複調用的遞迴或計算函數。
from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)

print(fib(10))  # 55


9. bisect

  • 用途:二分查找與插入操作。
  • 模組bisect
  • 特性:快速查找元素在已排序序列中的插入位置。
import bisect

nums = [1, 2, 4, 5]
bisect.insort(nums, 3)  # 插入保持排序
print(nums)  # [1, 2, 3, 4, 5]


10. queue.Queue

  • 用途:多執行緒安全的佇列。
  • 模組queue
  • 特性:適用於需要佇列操作的多執行緒場景。
from queue import Queue

q = Queue()
q.put(1)
q.put(2)
print(q.get())  # 1


11. array

  • 用途:處理數組類型的數據。
  • 模組array
  • 特性:比 Python 的列表更高效,適用於數值型數據。
from array import array

arr = array("i", [1, 2, 3])  # 初始化整數型陣列
arr.append(4)
print(arr)  # array('i', [1, 2, 3, 4])


12. struct

  • 用途:進行二進位數據處理與轉換。
  • 模組struct
  • 特性:適用於處理 C 類型結構數據。
import struct

packed_data = struct.pack("i", 42)  # 將整數轉換為二進位
print(struct.unpack("i", packed_data))  # (42,)


13. statistics

  • 用途:計算統計數據。
  • 模組statistics
  • 特性:提供均值、中位數、標準差等方法。
import statistics

data = [1, 2, 3, 4, 5]
print(statistics.mean(data))  # 3
print(statistics.median(data))  # 3


14. timeit

  • 用途:測量程式執行時間。
  • 模組timeit
  • 特性:適合測試程式性能。
import timeit

print(timeit.timeit("sum(range(1000))", number=1000))  # 測試執行時間


15. re

  • 用途:正規表示式處理。
  • 模組re
  • 特性:用於字串匹配、替換等操作。
import re

text = "The rain in Spain"
match = re.search("rain", text)
print(match.group())  # rain


以上工具在處理高效數據結構、演算法以及性能測試等方面非常實用,根據需求靈活選用能顯著提升程式效率與可讀性。

以下是另外 15 個 Python 標準庫中的實用工具,類似於 deque 和 defaultdict,同樣能提升開發效率與便利性:


1. uuid

  • 用途:生成唯一識別碼(UUID)。
  • 模組uuid
  • 特性:用於標識唯一對象或數據。
import uuid

unique_id = uuid.uuid4()
print(unique_id)  # 類似於 123e4567-e89b-12d3-a456-426614174000


2. collections.ChainMap

  • 用途:將多個字典合併為一個查詢對象。
  • 模組collections
  • 特性:不真正合併字典,但提供單一的查詢接口。
from collections import ChainMap

dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
chain = ChainMap(dict1, dict2)
print(chain["b"])  # 2,優先取第一個字典的值


3. typing.NamedTuple

  • 用途:類似 namedtuple,但支援型別提示。
  • 模組typing
  • 特性:更現代化,適用於型別安全的程式。
from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

p = Point(10, 20)
print(p.x, p.y)  # 10 20


4. pathlib

  • 用途:操作路徑的模組。
  • 模組pathlib
  • 特性:提供面向對象的文件路徑操作。
from pathlib import Path

p = Path("/tmp/example.txt")
print(p.name)  # example.txt
print(p.suffix)  # .txt


5. json

  • 用途:處理 JSON 格式數據。
  • 模組json
  • 特性:用於序列化和反序列化 JSON 資料。
import json

data = {"name": "Alice", "age": 25}
json_data = json.dumps(data)
print(json_data)  # {"name": "Alice", "age": 25}


6. csv

  • 用途:讀取和寫入 CSV 文件。
  • 模組csv
  • 特性:用於處理結構化數據。
import csv

with open("data.csv", mode="w", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(["Name", "Age"])
    writer.writerow(["Alice", 25])


7. random

  • 用途:生成隨機數或進行隨機選擇。
  • 模組random
  • 特性:支援數值範圍內的隨機操作。
import random

print(random.randint(1, 100))  # 隨機整數
print(random.choice(["apple", "banana", "cherry"]))  # 隨機選擇


8. secrets

  • 用途:生成密碼或安全隨機數。
  • 模組secrets
  • 特性:比 random 更安全,用於密碼學場景。
import secrets

password = secrets.token_hex(16)
print(password)  # 例如 a2b4c6d8e0f11234


9. textwrap

  • 用途:格式化長文字段。
  • 模組textwrap
  • 特性:用於控制文字寬度或段落格式。
import textwrap

text = "Python is an amazing programming language that is easy to learn and powerful."
wrapped = textwrap.fill(text, width=40)
print(wrapped)


10. dataclasses

  • 用途:定義簡單數據類型。
  • 模組dataclasses
  • 特性:自動生成初始化函數和其他方法。
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

p = Person("Alice", 25)
print(p)


11. time

  • 用途:處理時間相關操作。
  • 模組time
  • 特性:計算當前時間或執行時間。
import time

start = time.time()
time.sleep(1)
end = time.time()
print(f"Elapsed time: {end - start} seconds")


12. enum

  • 用途:定義列舉型別。
  • 模組enum
  • 特性:用於定義有意義的常數集合。
from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

print(Color.RED)  # Color.RED
print(Color.RED.value)  # 1


13. copy

  • 用途:支援深層複製和淺層複製。
  • 模組copy
  • 特性:用於處理複雜數據結構。
import copy

original = {"a": [1, 2, 3]}
shallow_copy = copy.copy(original)
deep_copy = copy.deepcopy(original)


14. hashlib

  • 用途:生成哈希值。
  • 模組hashlib
  • 特性:用於校驗文件或密碼散列。
import hashlib

text = "hello"
hash_obj = hashlib.sha256(text.encode())
print(hash_obj.hexdigest())  # 生成 SHA-256 哈希值


15. base64

  • 用途:進行 Base64 編碼和解碼。
  • 模組base64
  • 特性:用於數據傳輸或存儲。
import base64

data = "Python is great"
encoded = base64.b64encode(data.encode())
print(encoded)  # b'UHl0aG9uIGlzIGdyZWF0'
decoded = base64.b64decode(encoded).decode()
print(decoded)  # Python is great


這些工具涵蓋了檔案處理、數據結構、加密、時間管理等多種應用場景,適合解決日常開發中的不同問題。根據實際需求選用,能大幅提升開發效率!