Python「內建函數」(built-in functions)就是不用 import,隨時可以直接呼叫的函數,像 print()、len()、range() 這些,都算。
frozenset():建立不可變集合
語法:
frozenset() # 空的不可變集合
frozenset(iterable) # 從可迭代物件建立不可變集合frozenset() 就是「凍結版」的 set。它和 set 一樣不允許重複元素、支援集合運算,但建立後不能新增或刪除元素(不可變)。# 建立 frozenset
fs = frozenset([1, 2, 3, 2, 1])
print(fs) # frozenset({1, 2, 3})
print(type(fs)) # <class 'frozenset'>
# 空的 frozenset
empty = frozenset()
print(empty) # frozenset()不可變的特性
frozenset 不能新增或移除元素,嘗試修改會報錯。
fs = frozenset([1, 2, 3])
# 以下操作都會報 AttributeError
# fs.add(4)
# fs.remove(1)
# fs.discard(2)
# 但可以做查詢
print(2 in fs) # True
print(len(fs)) # 3frozenset 的優勢
因為不可變,frozenset 可以被 hash,所以能當作 dict 的 key 或放進另一個 set 裡(普通 set 不行)。
# 當 dict 的 key
permissions = {
frozenset(["read"]): "viewer",
frozenset(["read", "write"]): "editor",
frozenset(["read", "write", "admin"]): "admin",
}
user_perms = frozenset(["read", "write"])
print(permissions[user_perms]) # editor
# 放進 set 裡(集合的集合)
groups = {
frozenset([1, 2]),
frozenset([3, 4]),
frozenset([1, 2]), # 重複,會被去除
}
print(len(groups)) # 2集合運算一樣支援
a = frozenset([1, 2, 3])
b = frozenset([2, 3, 4])
print(a | b) # frozenset({1, 2, 3, 4})
print(a & b) # frozenset({2, 3})
print(a - b) # frozenset({1})
print(a ^ b) # frozenset({1, 4})小小綜合例子
# 用 frozenset 建立不可變的標籤系統
articles = [
{"title": "Python 入門", "tags": frozenset(["python", "beginner"])},
{"title": "進階 Python", "tags": frozenset(["python", "advanced"])},
{"title": "Web 開發", "tags": frozenset(["python", "web", "beginner"])},
]
# 收集所有標籤
all_tags = frozenset().union(*[a["tags"] for a in articles])
print(f"所有標籤:{all_tags}")
# frozenset({'python', 'beginner', 'advanced', 'web'})
# 找出包含 'beginner' 標籤的文章
for article in articles:
if "beginner" in article["tags"]:
print(f"初學者文章:{article['title']}")
# 初學者文章:Python 入門
# 初學者文章:Web 開發