python基礎-列表-不一樣的理解

本篇文章介紹什麼是列表,怎樣創建列表,列表的常見使用。這篇文章非常乾貨!值得一看!

什麼是列表

Lists are mutable sequences, typically used to store collections of homogeneous items (where the precise degree of similarity will vary by application)

列表是一種可變(mutable)序列,可以將其看作一種"容器",既然是"容器",那麼它就是用來裝東西的。那裝什麼呢?按照官網對list的定義,list是用來存儲homogeneous items(同構元素)。這裏又引入了一個概念homogeneous items,相對應的就是heterogeneous。一般在數學上,我們將homogeneous翻譯成齊次的,將heterogeneous翻譯成非齊次的。顯然,在工程上或者說在編程語言中將homogeneous翻譯成齊次的,是不合適的。那要怎麼理解這個概念了並能將其解釋清楚,我也是花了一番心思。我覺得將homogeneous翻譯成同構的,將heterogeneous翻譯成異構的,是比較合適的。

構 是指 數據結構 或者 數據類型 或者 對象。對於初學者來說,數據類型或者數據結構應該會更容易理解;如果暫時對 爲什麼 等價於 對象 不太理解,沒有關係,如果將來你學習了面向對象相關的知識,這個問題就會迎刃而解。好了,我們再回到列表的定義上,列表就是存儲同構元素的集合

可能有同學會問,我在同一個列表中,列表元素既可以是整數,也可以是浮點數,也可以是字符串等。顯然,列表是可以存儲異構元素的。爲什麼會這樣呢?難道列表的定義不對。

我們再換一個角度來看,列表本質上就是一個存儲數據的容器。既然是數據,那麼數據肯定會被處理。我們假設這樣一個場景,列表中存儲的是異構的元素,當我們使用for循環遍歷列表元素,然後對異構元素進行處理時,顯然需要增加判斷邏輯,來判斷元素的類型,然後才能做相應類型的數據處理。可能1、2個不同類型的if判斷,還能接受,但是,如果列表中的異構元素多了,數據處理的這段代碼隨着時間的推移就會變得非常糟糕,可讀性和擴展性都會變差,這是不符合python哲學的。所以這就是爲什麼列表的定義中強調homogeneous items。

所以,雖然在語法上,python列表中可以存儲異構元素,不會有什麼語法問題,程序也可以運行,但是不建議這麼做。下面,我給出了一段具體的list 存儲異構元素的代碼:

# 列表存儲不同類型的對象
list1 = [1, 2, 3.14, "漁道"]
print(list1)  # 打印輸出 [1, 2, 3.14, '漁道']

列表定義中有兩個關鍵詞 一個是mutable,一個是homogeneous。前面我已經解釋了homogeneous,接下來解釋一下mutable,翻譯過來就是可變的。也就是說,列表的元素定義後還可被改變。例如,

list1 = [1, 2, 3.14, "漁道"]
print(id(list1)) # 打印地址 2520446357960

print(id(list1[0])) # 打印地址 140704257974672
list1[0] = 2
print(id(list1[0]))	# 打印地址 140704257974704
print(id(list1))	# 打印地址 2520446357960

從上面的例子中可以看出,我將list1的第0個元素修改後,程序是能正常運行的。說明列表的元素是可以被修改的,即mutable。

ok,以上內容非常清晰的闡述了列表的定義,以及該定義背後深層次的邏輯。搞清楚了列表的定義,接下來就是對它進行使用了。

怎樣構造列表

  • 使用一對中括號構造一個列表對象
  • 使用列表表達式構造一個列表對象
  • 使用list([iterable])函數構造一個列表對象
lst1 = []
print(f'{type(lst1)} address is {id(lst1)}') # <class 'list'> address is 1822965584328
print(f'values of lst1 are {lst1}') # values of lst1 are []

lst2 = [i for i in range(10)]
print(f'{type(lst2)} address is {id(lst2)}') # <class 'list'> address is 1822965584840
print(f'values of lst2 are is {lst2}') # values of lst2 are is [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

lst3 = list()
print(f'{type(lst3)} address is {id(lst3)}') # <class 'list'> address is 1822969302920
print(f'values of lst3 are is {lst3}') # values of lst3 are is []

lst4 = list(lst2)
print(f'{type(lst4)} address is {id(lst4)}') # <class 'list'> address is 1822969297288
print(f'values of lst3 are is {lst4}') # values of lst3 are is [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

lst1 是使用一對中括號 創建一個空列表對象;

lst2 是使用列表表達式 創建一個列表對象;

lst3 是使用列表構造函數 創建一個空列表對象;

lst4 也是使用列表構造函數 創建一個列表對象,構造函數的入參爲iterable對象(lst2);

列表的使用

列表是python中三種主要序列類型(sequence types)的一種。前面的文章python基礎-字符串的定義/表示/序列操作中介紹字符串,我們知道字符串本質上也是一種序列,只不過它是由字符構成。

只要是序列,就會有相應的序列操作:

  • 成員測試操作,使用in測試成員是否在序列中;

    lst = [i for i in range(10)]
    if 1 in lst:
        print('yes')
    else:
        print('no')
    
  • 連接操作(或者說是加法操作),使用 +將兩個對象(列表、元組等)連接起來;

    lst1 = [i for i in range(10)]
    lst2 = [i for i in range(10)]
    lst3 = lst1 + lst2
    print(lst3) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
  • 乘法操作,使用*將一個對象重複多次;

    lst1 = [i for i in range(3)]
    lst2 = lst1 * 3
    print(lst2) # [0, 1, 2, 0, 1, 2, 0, 1, 2]
    
  • 索引操作,使用[i]對某個對象進行索引,說白了就是獲取該對象中的元素;

    lst1 = [i for i in range(3)]
    print(lst1[0]) # 0
    print(lst1[1]) # 1
    print(lst1[2]) # 2
    
  • 切片操作,使用[i:j:k]獲取某個對象以k爲步長,從i到j的元素;

    lst1 = [i for i in range(10)]
    print(lst1[1:5:1]) # [1, 2, 3, 4]
    print(lst1[0:10:2]) # [0, 2, 4, 6, 8]
    

列表對象的常用函數就不再過多的介紹了,使用時如果不記得參數,查一下就好了。

好了,列表的介紹就到這裏啦!

原創不易,若認可本文,老鐵請給點贊、評論、分享、收藏、打賞。你的鼓勵與支持是我前進的動力!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章