max() 是 Python 內建函數,用於回傳一組值中的最大值。它支援多引數、可迭代物件、自訂比較鍵,並能處理字串、元組等可比較型別。本文系統整理語法、參數、回傳值、進階用法與常見陷阱。
max(iterable, *[, key, default])
max(arg1, arg2, *args[, key])
| 形式 | 參數 | 說明 |
|---|---|---|
| 多引數 | arg1, arg2, ... | 兩個以上可比較的物件 |
key (可選) | 單引數函式,提取比較鍵 | |
| 可迭代物件 | iterable | 非空可迭代物件(list, tuple, set, dict.keys() 等) |
key (可選) | 同左 | |
default (可選) | 若 iterable 為空,回傳此值(Python 3.4+),否則拋出 ValueError |
print(max(80, 100, 1000)) # 1000
print(max(-20, 100, 400)) # 400
print(max(-80, -20, -10)) # -10
print(max(0, 100, -400)) # 100
# 字串比較(依 Unicode 碼點)
print(max('apple', 'banana', 'cherry')) # 'cherry'
# 列表/元組
print(max([3, 1, 4, 1, 5])) # 5
print(max((3, 1, 4))) # 4
# 依絕對值最大
print(max(-10, 5, 8, key=abs)) # -10
# 字典列表依特定欄位
users = [{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 35}]
oldest = max(users, key=lambda u: u['age'])
print(oldest) # {'name': 'Charlie', 'age': 35}
# 複雜物件
class User:
def __init__(self, name, score):
self.name = name
self.score = score
def __repr__(self):
return f"User({self.name}, {self.score})"
players = [User('A', 88), User('B', 95), User('C', 95)]
top = max(players, key=lambda p: (p.score, p.name)) # 分數相同再比名字
print(top) # User(B, 95)
# Python 3.4+ 支援 default
print(max([], default=0)) # 0
print(max([], default=None)) # None
# 舊版相容寫法
def safe_max(iterable, default=None):
try:
return max(iterable)
except ValueError:
return default
key 回傳 tuple,Python 依序比較元素。max(range(len(seq)), key=seq.__getitem__) 或 max(enumerate(seq), key=lambda x: x[1])[0]。max(d, key=d.get)(回傳 key),max(d.values())(回傳 value)。operator:max(items, key=itemgetter(1)) 比 lambda 略快。max(1, 'a')(TypeError),Python 2 允許但語意模糊。max([]) 拋出 ValueError: max() arg is an empty sequence。key 函式不應修改原物件,否則行為不可預期。max([1, float('nan'), 2]) 回傳 nan,需先過濾。numpy.max 或 np.ndarray.max(),向量化更快。key 函式對每個元素只呼叫一次(內部用 Schwartzian transform),效能優於舊式 cmp。max() 與其對應的 min() 是 Python 資料處理的基石,靈活運用 key、default 與 tuple 比較,能以極簡潔程式碼解決複雜的「找極值」問題。