Python中使用Frozenset對象的案例詳解
這篇文章將介紹在Python中使用 "frozenset "函數的指南,該函數返回一個新的frozenset類型的Python對象。這些對象類似於Python中的set對象,但有一些關鍵的區別。本文的所有代碼樣本都是在Ubuntu 21.04上用Python 3.9.5測試的。
關於Frozensets
frozenset 函數接收一個可迭代類型的 Python 對象的參數,並返回一個新的 frozenset 類型的 Python 對象。一個 frozenset 類型的對象是一個可散列的、不可改變的 Python 對象,其元素在整個生命周期內是凍結的或不可改變的。與元素可以隨時改變的集合類型的Python對象相反,frozenset中的所有項目都保持不變。frozensets 的用法可以通過例子得到最好的理解。下面將解釋其中的一些。
創建一個新的Frozenset對象
要獲得一個新的 frozenset類型的對象,隻需提供任何可迭代的類型作為frozenset函數的可選參數。下面是一個代碼示例。
l = [1, 2, 3, 4] fset = frozenset(l) print (fset) print (type(fset))
代碼中的第一條語句定義瞭一個新的列表,它被簡單地稱為 "l"。接下來,通過調用frozenset函數並提供列表作為參數,創建瞭一個新的frozenset對象。運行上述代碼示例後,你應該得到以下輸出。
frozenset({1, 2, 3, 4}) <class 'frozenset'>
正如你在輸出中看到的,fset是一個frozenset類型的對象,它使用瞭Python中set也使用的大括號語法。Frozenset隻包含唯一的項目,因為不允許有重復的項目,這一點與Python的set類型對象非常相似。每個frozenset類型的對象都是一個 Python 集合,但反之亦然,因為集合項可以通過調用一些方法來改變。註意,你可以通過調用沒有任何參數的frozenset函數來創建一個空的frozenset。
一旦創建瞭Frozenset,你就不能修改它瞭
如前所述,一個frozenset類型的對象有一些項目,在其生命周期內不會改變。雖然你可以用 frozenset 類型對象使用 Python 集合的方法,但是如果你試圖使用改變原始frozenset對象本身的方法,就會出現錯誤。下面是一個例子。
l = [1, 2, 3, 4] new_set = set(l) new_set.remove(1) print (new_set) fset = frozenset(l) fset.remove(1)
在上面的代碼示例中,有兩條語句調用瞭集合類型對象的 "刪除"方法。雖然一個項目被成功地從 "new_set"中刪除,但當對 "fset"調用remove方法時,卻拋出瞭一個錯誤。運行上述代碼示例後,你應該得到以下輸出。
{2, 3, 4} Traceback (most recent call last): File "main.py", line 9, in <module> fset.remove(1) AttributeError: 'frozenset' object has no attribute 'remove'
其他類似的方法,如 "add"、"pop"、"clear"、"discard "等,對forzensets不起作用。
與 Frozensets 一起使用的方法
所有不修改集合項的 Python 集合方法都對frozenset類型的對象有效。所以你可以比較兩個frozenset的等價或不等價,迭代/循環它們,獲得兩個frozenset之間的共同或唯一元素,等等。下面是一個例子,顯示瞭一些與frozensets有關的方法。
fset1 = frozenset([1, 2, 3, 4]) fset2 = frozenset([3, 4, 5, 6]) print (fset1.intersection(fset2)) print (fset1.union(fset2)) print (fset1.difference(fset2)) print (len(fset1)) print (len(fset2))
這些代碼是不言自明的。一些不改變原始frozensets值的方法已經被調用。這些方法主要用於比較兩個不同frozensets的元素。運行上述代碼樣本後,你應該得到以下輸出。
frozenset({3, 4}) frozenset({1, 2, 3, 4, 5, 6}) frozenset({1, 2}) 4 4
其他一些處理凍結集的方法有:"issubset"、"issuperset"、"symmetric_difference"、"copy",等等。像">"、"<"、">="和"<="這樣的等價運算符也適用於frozenset類型對象。
Frozenset可以被轉換為其他可迭代類型
你可以通過調用它們的主構造函數將frozenset類型的對象轉換為其他可迭代的對象。下面的代碼示例顯示瞭將frozenset類型對象轉換為list、tuple和set類型對象。
fset = frozenset([1, 2, 3, 4]) print (list(fset)) print (tuple(fset)) print (set(fset))
運行上述代碼樣本後,你應該得到以下輸出。
[1, 2, 3, 4]
(1, 2, 3, 4)
{1, 2, 3, 4}
Frozenset使用案例
由於frozenset對象隻不過是不可改變的/不可變的集合類型的 Python 對象,你可能會想知道它們的效用,因為集合總是可以被用來代替它們。frozenset最明顯的用例是用於聲明具有獨特元素的集合類型對象,而沒有在代碼中意外改變它們的風險。Frozenset類型的對象可以被用作字典的鍵,而集合則不能用於同樣的目的。由於frozenset是可散列的,它們可以在集合內使用,而集合不能插入到另一個集合中。看一下下面的代碼。
fset = frozenset({4, 5}) s = {1, 2, fset} print (s) s = {1, 2, {4, 5}}
在第二條語句中,一個frozenset已經在創建過程中被添加到一個集合中。在最後一條語句中,一個集合類型的對象被用在另一個集合裡面。運行上述代碼示例後,你應該得到以下輸出。
{frozenset({4, 5}), 1, 2} Traceback (most recent call last): File "main.py", line 27, in <module> s = {1, 2, {4, 5}} TypeError: unhashable type: 'set'
正如你在輸出中看到的,forzensets可以被添加到其他集合中。另一方面,將一個集合添加到另一個集合中會產生一個錯誤,因為集合隻接受可散列類型的項目。
總結
Frozensets提供瞭一種創建不可變的集合的方法。它們隻接受唯一的元素,並且是可散列類型的對象,所以它們可以在其他隻接受可散列對象作為子對象的 Python 對象中使用。
到此這篇關於如何在Python中使用Frozenset對象的文章就介紹到這瞭,更多相關Python Frozenset對象內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python 列表(List)的底層實現原理分析
- 詳細介紹Python中的set集合
- Python常見異常類型處理
- Python入門教程之變量與數據類型
- python列表中remove()函數的使用方法詳解