ข้ามไปยังเนื้อหา

Stdlib Tour

Python standard library มีขนาดใหญ่ แต่มี module จำนวนหนึ่งที่ปรากฏในเกือบทุก codebase จริงจัง บทเรียนนี้จะพาคุณรู้จักห้า module อย่างลงมือปฏิบัติ: collections, itertools, datetime, json และ pathlib


module collections ขยาย container built-in ของ Python ด้วยสี่ตัวหลักที่คุณจะใช้ทุกวัน

Counter นับ hashable object และรองรับ arithmetic บน count

from collections import Counter
c = Counter("aabbbcc")
print(c) # Counter({'b': 3, 'a': 2, 'c': 2})
print(c.most_common(2)) # [('b', 3), ('a', 2)]

defaultdict ไม่เคย raise KeyError — key ที่หายไปจะถูก initialise อัตโนมัติด้วย factory ที่คุณกำหนด

from collections import defaultdict
dd = defaultdict(list)
dd["fruits"].append("apple") # no KeyError on a fresh key

namedtuple สร้าง record type แบบ lightweight, immutable ที่มี named field — อ่านง่ายกว่า tuple ธรรมดาและไม่มี overhead ต่างจาก tuple ปกติ

from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(3, 4)
print(p.x, p.y) # 3 4

itertools มี iterator building block ที่ compose ได้ดีและไม่ materialize sequence ทั้งหมดในหน่วยความจำจนกว่าจะถูกขอ

chain รวม iterable หลายตัวเป็น stream เดียว islice ตัด iterator ใดก็ได้อย่าง lazy groupby จัดกลุ่ม element ที่มี key เท่ากันติดกัน — input ต้องถูก sort ตาม key เดียวกันก่อน

import itertools
list(itertools.chain([1, 2], [3, 4])) # [1, 2, 3, 4]
list(itertools.islice(range(100), 5)) # [0, 1, 2, 3, 4]

import collections
import itertools
# --- Counter ---
words = "the quick brown fox jumps over the lazy dog the fox".split()
c = collections.Counter(words)
print("top 3:", c.most_common(3))
# --- defaultdict ---
dd = collections.defaultdict(list)
for k, v in [("a", 1), ("b", 2), ("a", 3)]:
dd[k].append(v)
print("grouped:", dict(dd))
# --- namedtuple ---
Point = collections.namedtuple("Point", ["x", "y"])
p = Point(3, 4)
print("point:", p, "| x =", p.x)
# --- chain ---
merged = list(itertools.chain([1, 2], [3, 4], [5]))
print("chained:", merged)
# --- groupby (data must be sorted) ---
data = [("a", 1), ("a", 2), ("b", 3), ("b", 4)]
for key, group in itertools.groupby(data, key=lambda t: t[0]):
print(key, list(group))

module datetime จัดการ date, time และการคำนวณระหว่างกัน object datetime.datetime เป็น immutable; operation เช่นการบวก timedelta จะคืน object ใหม่

Demo ด้านล่างใช้ วันที่คงที่ เพื่อให้ output คาดเดาได้เสมอ — เป็นนิสัยที่ดีเมื่อเขียน example หรือ test


json.dumps แปลง Python object เป็น JSON string; json.loads parse กลับ argument separators ช่วยตัด whitespace สำหรับ output แบบ compact

import json
s = json.dumps({"key": "value"}, separators=(",", ":"))
# '{"key":"value"}'

import datetime
import json
# Fixed date for determinism
dt = datetime.datetime(2024, 3, 14, 9, 26, 53)
print("pi day:", dt.strftime("%Y-%m-%d %H:%M:%S"))
delta = datetime.timedelta(days=10)
print("plus 10 days:", (dt + delta).date())
# json round-trip
obj = {"name": "Python", "versions": [3, 10, 11]}
s = json.dumps(obj, separators=(",", ":"))
print("serialized:", s)
back = json.loads(s)
print("name:", back["name"], "| latest:", back["versions"][-1])

pathlib.Path แทน path ระบบไฟล์เป็น object ที่มี method และ property แทนที่การใช้ string ของ os.path แบบเก่า

from pathlib import Path
p = Path("/usr/local/lib/python3.12/site-packages/requests/__init__.py")
print(p.suffix) # .py
print(p.stem) # __init__
print(p.parts) # ('/', 'usr', 'local', 'lib', 'python3.12', 'site-packages', 'requests', '__init__.py')
# Building paths with /
project = Path.home() / "projects" / "myapp"
config = project / "config.toml"
print(config)

pathlib จัดการ path ระบบไฟล์ — รัน code นี้ใน local; sandbox ของ browser ไม่มีระบบไฟล์จริง


`collections.Counter('aab')` ให้ผลลัพธ์อะไร?
ทำไมต้อง sort ข้อมูลก่อนส่งให้ `itertools.groupby`?
`datetime` method ใดที่ format วันที่เป็น string?