數據類型(元組,集合,字典,None)


接上一篇的元組


同時賦多個值


以下是一種很酷的編程捷徑:在 Python 中,可使用元組來一次賦多值。


>>> v = ('a', 2, True)
>>> (x, y, z) = v
>>> x
'a'
>>> y
2
>>> z
True

內建的 range() 函數構造瞭一個整數序列。(從技術上來說, range() 函數返回的既不是列表也不是元組,而是一個 迭代器,但稍後您將學到它們的區別。)


>>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)  ①
>>> MONDAY ②
0
>>> TUESDAY
1
>>> SUNDAY
6

集合


集合set 是裝有獨特值的無序“袋子”。一個簡單的集合可以包含任何數據類型的值。如果有兩個集合,則可以執行像聯合、交集以及集合求差等標準集合運算。


集合的創建


用{}


>>> a_set = {1}     ①
>>> a_set
{1}
>>> type(a_set) ②
<class 'set'>
>>> a_set = {1, 2} ③
>>> a_set
{1, 2}

列表 為基礎創建集合。


用set()函數。值得註意的是,不能使用兩個花括號來創建空集合,隻能

>>> a_set = set()。但該操作實際創建一個空字典,而不是一個空集合。


>>> a_list = ['a', 'b', 'mpilgrim', True, False, 42]
>>> a_set = set(a_list) ①
>>> a_set ②
{'a', False, 'b', True, 'mpilgrim', 42}

添加參數


有兩種方法可向現有集合中添加值: add() 方法和 update() 方法。



  • add() 方法接受單個可以是任何數據類型的參數,並將該值添加到集合之中。

    a_set.add(4)

  • update() 方法僅接受一個集合作為參數,並將其所有成員添加到初始列表中。其行為方式就像是對參數集合中的每個成員調用 add()

    方法。 由於集合不能包含重復的值,因此重復的值將會被忽略。

    a_set.update({3, 6, 9}, {1, 2, 3, 5, 8, 13})


刪除元素


有三種方法可以用來從集合中刪除某個值。



  • 前兩種,discard() 和 remove() 有細微的差異。

    區別在這裡:如果該值不在集合中,remove() 方法引發一個 KeyError 例外。


 >>> a_set
{1, 3, 36, 6, 45, 15, 21, 28}
>>> a_set.remove(21) ③
>>> a_set
{1, 3, 36, 6, 45, 15, 28}


  • 就像列表,集合也有個 pop() 方法。

    pop() 方法從集合中刪除某個值,並返回該值。然而,由於集合是無序的,並沒有“最後一個”值的概念,因此無法控制刪除的是哪一個值。它基本上是隨機的。

  • clear() 方法刪除集合中所有的值,留下一個空集合。它等價於

    a_set = set(),該語句創建一個新的空集合,並用之覆蓋 a_set 變量的之前的值。


集合運算


>>> a_set = {2, 4, 5, 9, 12, 21, 30, 51, 76, 127, 195}
>>> 30 in a_set ①
True
>>> 31 in a_set
False
>>> b_set = {1, 2, 3, 5, 6, 8, 9, 12, 15, 17, 18, 21}
>>> a_set.union(b_set) ②
{1, 2, 195, 4, 5, 6, 8, 12, 76, 15, 17, 18, 3, 21, 30, 51, 9, 127}
>>> a_set.intersection(b_set) ③
{9, 2, 12, 5, 21}
>>> a_set.difference(b_set) ④
{195, 4, 76, 51, 30, 127}
>>> a_set.symmetric_difference(b_set) ⑤
{1, 3, 4, 6, 8, 76, 15, 17, 18, 195, 127, 30, 51}


  • in 運算符.要檢測某值是否是集合的成員,可使用 in 運算符。其工作原理和列表的一樣。

  • 交,union() 方法返回一個新集合,其中裝著 在兩個 集合中出現的元素。

  • 並,intersection() 方法返回一個新集合,其中裝著 同時 在兩個集合中出現的所有元素。

  • 補, difference() 方法返回的新集合中,裝著所有在 a_set 出現但未在 b_set 中的元素。

  • 最後,有幾個您可能會問到的問題。


>>> a_set = {1, 2, 3}
>>> b_set = {1, 2, 3, 4}
>>> a_set.issubset(b_set) ①
True
>>> b_set.issuperset(a_set) ②
True
>>> a_set.add(5) ③
>>> a_set.issubset(b_set)
False
>>> b_set.issuperset(a_set)
False

a_set 是 b_set 的 子集 — 所有 a_set 的成員均為 b_set 的成員。

同樣的問題反過來說, b_set 是 a_set 的 超集,因為 a_set 的所有成員均為 b_set 的成員。

一旦向 a_set 添加一個未在 b_set 中出現的值,兩項測試均返回 False 。


字典


字典 是鍵值對的無序集合。向字典添加一個鍵的同時,必須為該鍵增添一個值。(之後可隨時修改該值。) Python 的字典為通過鍵獲取值進行瞭優化,而不是反過來。


Python 中的字典與 Perl 5 中的 hash [散列]類似。在 Perl 5 中,散列存儲的變量總是以一個 % 符開頭。在 Python 中,變量可以隨意命名,而 Python 內部跟蹤其數據類型。


創建


>>> a_dict = {'server': 'db.diveintopython3.org', 'database': 'mysql'}

修改


>>> a_dict
{'server': 'db.diveintopython3.org', 'database': 'blog'}
>>> a_dict['user'] = 'mark'

字典鍵是區分大小寫的;

在字典中不允許有重復的鍵,對現有的鍵賦值將會覆蓋舊值。


混合值字典


字典的可以是任何數據類型,甚至是其它的字典。

字典的要嚴格得多(鍵是前面的)

1.不允許一個鍵對應多個值,

2.鍵必須是可哈希的。

在同一字典中也可混合、匹配使用不同數據類型的鍵。


SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}

讓我們在交互式 shell 中剖析一下:

>>> SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
... 1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
>>> len(SUFFIXES) ①
2
>>> 1000 in SUFFIXES ②
True
>>> SUFFIXES[1000] ③
['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
>>> SUFFIXES[1024] ④
['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
>>> SUFFIXES[1000][3] ⑤
'TB'


  1. 類似 列表 和 集合 ,len() 函數將返回字典中鍵的數量。

  2. 而且像列表和集合一樣,可使用 in 運算符以測試某個特定的鍵是否在字典中。

  3. 1000 是 字典 SUFFIXES 的一個鍵;其值為一個 8 元素列表(確切地說,是 8 個字符串)。

  4. 同樣, 1024 是字典 SUFFIXES 的鍵;其值也是一個 8 元素列表。

  5. 由於 SUFFIXES[1000] 是列表,可以通過它們的 0 基點索引來獲取列表中的單個元素。


>>> is_it_true({})
no, it's false

在佈爾類型上下文環境中,空字典為假值。


None


None 是 Python 的一個特殊常量。它是一個 空 值。None 與 False 不同。None 不是 0 。None 不是空字符串。將 None 與任何非 None 的東西進行比較將總是返回 False 。


None 是唯一的空值。它有著自己的數據類型(NoneType)。可將 None 賦值給任何變量,但不能創建其它 NoneType 對象。所有值為 None 變量是相等的。


>>> type(None)
<class 'NoneType'>
>>> None == False
False
>>> None == 0
False

在 佈爾類型上下文環境中, None 為假值,而 not None 為真值。


>>> def is_it_true(anything):
... if anything:
... print("yes, it's true")
... else:
... print("no, it's false")
...
>>> is_it_true(None)
no, it's false
>>> is_it_true(not None)
yes, it's true

0 個評論

要回覆文章請先登錄註冊