首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python dict.get() 方法完全指南:安全取值、預設值模式、避免 KeyError 與三元運算子替代

     編輯:更多程式設計知識

dict.get(key, default=None) 是字典安全取值的核心方法:鍵存在回傳值,不存在回傳預設值 (預設 None),永不拋出 KeyError。

語法與基本用法


d = {'Name': 'Zara', 'Age': 27}

print(d.get('Age'))           # 27
print(d.get('Sex'))           # None
print(d.get('Sex', 'Never'))  # 'Never' (自訂預設值)

# 對比:直接索引
# print(d['Sex'])  # KeyError: 'Sex'

核心使用模式

1. 安全取值 + 就地預設 (避免 if/else)


# 累加計數
counts = {}
for word in ['apple', 'banana', 'apple']:
    counts[word] = counts.get(word, 0) + 1
print(counts)  # {'apple': 2, 'banana': 1}

# 建立列表分組
groups = {}
for item in data:
    groups.setdefault(item.category, []).append(item)
# 或用 get + 列表推導 (較不直觀)

2. 可選配置參數


def connect(host, config=None):
    config = config or {}
    timeout = config.get('timeout', 30)
    retries = config.get('retries', 3)
    ssl = config.get('ssl', True)
    # ...

3. 替代三元運算子


# 冗長
value = d['key'] if 'key' in d else default

# 簡潔
value = d.get('key', default)

get() vs setdefault() vs [] 關鍵差異

方法鍵存在鍵不存在修改字典
d[key]回傳值KeyError否
d.get(key)回傳值None否
d.get(key, def)回傳值回傳 def否
d.setdefault(key, def)回傳值設定鍵=def,回傳 def是

進階:呼叫端預設值 vs 字典內預設值


# get: 預設值由呼叫端決定,字典不變
d = {'a': 1}
print(d.get('b', 0))  # 0
print(d)              # {'a': 1}

# setdefault: 預設值寫入字典
d = {'a': 1}
print(d.setdefault('b', 0))  # 0
print(d)                     # {'a': 1, 'b': 0}

效能與最佳實踐

  • get 為 C 層實現,極快,熱點路徑首選
  • 避免 'key' in d and d['key'] 雙重查找
  • 預設值為可變物件時,每次呼叫傳入新物件:
    
      # 錯誤:共享同一列表
      d.get('key', []).append(1)
      
      # 正確:每次新建
      d.get('key', []).append(1)  # 但這裡 append 後列表即丟棄
      # 真正需求用 setdefault 或 defaultdict
      from collections import defaultdict
      d = defaultdict(list)
      d['key'].append(1)
      

實用封裝:多層級安全取值


def deep_get(d, *keys, default=None):
    """安全取得巢狀字典值: deep_get(d, 'a', 'b', 'c')"""
    for k in keys:
        if isinstance(d, dict):
            d = d.get(k)
        else:
            return default
    return d if d is not None else default

data = {'user': {'profile': {'name': 'Alice'}}}
print(deep_get(data, 'user', 'profile', 'name'))  # 'Alice'
print(deep_get(data, 'user', 'settings', 'theme'))  # None

get() 是字典操作的「瑞士刀」,善用預設值模式能大幅減少防禦性程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved