天天看點

4. 清單一學完,Python 會一半,滾雪球學 Python四、清單一學完,Python 會一半

滾雪球學 Python,目标就是讓 Python 學起來之後,越滾越大。

四、清單一學完,Python 會一半

4.1 清單是個啥

清單,先記住英文為 list ,它是 Python 中一種可以動态添加删除内容的資料類型,由一系列的元素組成。直白點說清單是将多個變量組合在一起的那麼一個容器。

很多文章會找一個與清單相似的程式設計概念,一般會說 Python 中的清單跟其他語言的數組一樣,但對于沒有任何程式設計概念的同學來說,數組也是一個陌生概念。其實你可以簡單了解一下即可,Python 中的清單就是一個容器,裡面可以放任意資料類型的變量。

4.1.1 清單定義

清單定義的格式如下

my_list = [元素1,元素2,元素3...]           

清單的每一個資料都稱作元素或者項,清單用

[]

包裹,每一個元素用英文

,

分隔,清單可以直接列印輸出。

my_list = ["apple", "orange", "grape", "pear"]
print(my_list)           

清單中的元素可以為相同資料類型,也可為不同資料類型,是以清單嵌套清單也是可行的。

my_list = [1, "orange", True, 1.0, [1, 2, 3]]
print(my_list)           

4.1.2 清單讀取

清單的讀取需要先學習兩個名詞,一個是索引,另一個是下标,這兩個詞是同一個意思,都是為了準确的擷取清單中的元素。索引先簡單了解成序号一類的概念即可。

首先你要學會的是清單中索引是從 0 開始的,這個概念第一次接觸有點楞,熟悉了就會好很多。就像我們數數字都是從 1 開始數,忽然間需要變成從 0 開始數了,需要适應期。

例如在看一下剛才的清單,嘗試用中文讀取出來每一個元素的索引。

my_list = ["apple", "orange", "grape", "pear"]           

索引為 0 的元素是字元串

apple

,索引為 1 的元素是字元串

orange

,依次類推。

清單讀取的文法格式如下:

# 清單名[索引]
my_list[i]           

以上内容轉換成 Python 代碼為:

my_list = ["apple", "orange", "grape", "pear"]
print("索引為0的元素是:", my_list[0])
print("索引為1的元素是:", my_list[1])
print("索引為2的元素是:", my_list[2])
print("索引為3的元素是:", my_list[3])           

通過索引擷取元素的時候,一定要注意索引是從 0 開始的,從 0 開始的,雖然反複寫,但是還是很容易被忘記...... 唉~

索引除了為正數以外,還可以為負數,擷取清單的最後一個元素的索引是 -1,代碼如下:

nums = [1,2,3,4,5,6]
print("清單最後一個元素為:",nums[-1])           

依據順序,-1 表示最後一個元素,-2 表示倒數第 2 項...

4.1.3 清單切片

編寫程式時對清單的操作經常會有如下場景。

  • 擷取 1~3 項元素;
  • 擷取 4~7 項元素;
  • 擷取第 1,3,5...項元素。

這些内容轉換到清單的實際編碼中,被稱為切片操作,就是你腦中現在呈現的切肉片動作。

具體的文法格式如下:

# 讀取從索引 m 到 n-1 的清單元素
my_list[m:n]
# 讀取清單的前 n 項元素
my_list[:n]
# 讀取清單從 m 開始到結尾的元素
my_list[m:]
# 間隔 s,讀取從 m 到 n 的清單元素
my_list[m:n:s]           

以上内容反映到代碼中呈現如下,該部分呈現到代碼中如下,尤其注意 m 與 n 的取值。

my_list = ["a","b","c","d","e","f"]

# 輸出 ['a', 'b', 'c'] 注意 a,b,c 的索引分别是 0,1,2
print(my_list[0:3])
# 輸出 ['b', 'c', 'd', 'e'] 注意 b,c,d,e 的下标分别是 1,2,3,4
print(my_list[1:5])
# 輸出 ['b', 'c', 'd', 'e', 'f']
print(my_list[1:])
# 輸出 ['a', 'b', 'c', 'd', 'e']
print(my_list[:5])
# 輸出 ['b', 'd']  從索引 1 到索引 3,間隔 1 個索引取
print(my_list[1:4:2])           

清單切片在後續的 Python 學習中屬于非常重要的知識點,核心還是理清楚索引是如何對應到清單中每一項元素。

4.1.4 清單相關内置函數

在 Python 中與清單相關的内置函數常見的有 4 個,分别是擷取最大值 max、最小值 min、求和 sum 以及擷取清單元素個數 len。

最大值與最小值

使用 max 與 min 函數可以直接擷取清單中的最大值與最小值,該函數使用有些注意事項需要了解下,具體還是參照代碼:

my_list1 = ["a","b","c","d","e","f"]
my_list2 = [1,2,3,4,5,6]
my_list3 = ["a",1,2,3,4]

# 輸出 f
print(max(my_list1))
# 輸出 6
print(max(my_list2))
# 報錯
print(max(my_list3))           

上述代碼在運作時發現,前面 2 個清單可以輸出最大值,但是第三個直接報錯,這是因為 max 與 min 隻能用于元素全是數字或者全是字元串的清單,如果清單中有其他資料類型或者數字與字元串混合就會報錯。

min 用法和 max 完全一緻,不在編寫代碼嘗試。

求和

sum 函數可以擷取清單元素總和,但是需要注意下 sum 不能用于元素非數值情況,也就說下面的代碼是錯誤的。

my_list1 = ["a","b","c","d","e","f"]
print(sum(my_list1))           

擷取清單元素個數

該函數使用頻次極高,在很多地方都需要擷取清單元素個數,使用 len 函數即可,由于代碼非常簡單,自行測試即可。

4.1.5 清單元素的修改與删除

對于一個清單資料類型的變量來說,它是可以進行修改與删除元素的,這就是本文開篇提及的清單是 Python 中一種可以動态添加删除内容的資料類型(該小節暫時還無法對清單進行動态添加,後文會講解到)。

清單的元素可以通過索引進行擷取修改。

my_list1 = ["a","b","c","d","e","f"]
print("修改前的清單",my_list1)
my_list1[4] = "橡皮擦"
print("修改後的清單",my_list1)           

清單元素的删除操作分為兩種情況,簡單說一種是删除單個元素,一種是删除多個元素。删除與清單切片關聯度極高,可比對下述代碼進行學習。

my_list1 = ["a","b","c","d","e","f"]

# 通過索引删除某一進制素
del my_list1[0]
print(my_list1)

my_list1 = ["a","b","c","d","e","f"]
# 通過索引删除清單區間元素
del my_list1[0:3]
print(my_list1)

my_list1 = ["a","b","c","d","e","f"]
# 通過索引删除清單區間元素
del my_list1[0:3:2]
print(my_list1)           

删除操作使用的關鍵字是

del

,關鍵點相信你也已經發現,通過索引找到元素然後在通過

del

删除元素。

以上内容,請注意是對清單中的元素進行操作,下面我們将學習如何對一個完整的清單進行操作。

4.1.6 清單相加,相乘,删除

在 Python 中可以直接對清單進行相加與相乘操作,清單與清單之間的相加可以了解為清單的連接配接,代碼如下:

my_list1 = ["a","b"]
my_list2 = ["c"]
my_list3 = my_list1 + my_list2
print(my_list3)           

任意多個清單直接如果用 “+” 進行操作,那麼這些清單将會連接配接起來形成一個新的大清單。

清單可以與一個數字進行乘法計算,表示重複前面的清單多次,例如下述代碼:

my_list1 = ["a","b"]
my_list2 = ["c"]
my_list3 = my_list1 * 4
# 輸出結果為 ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
print(my_list3)           

上述代碼用

[a,b] * 4

得到結果為清單

[a,b]

重複出現了 4 次。

4.2 初識 Python 面向對象

Python 是一門面向對象的程式設計語言,是以在 Python 中所有的資料都是對象,例如之前學習到的整數、浮點數、字元串、清單都是對象,關于面向對象的概念不做過多的解釋(畢竟現在解釋也沒啥用,具體等學到面向對象部分在進行說明)。

我們可以給各種對象設計一些

方法

,這些

方法

也是廣義上的

函數

,是不是聽起來有些繞,在 Python 中已經為一些基本對象内置了一些方法,從清單開始我們将逐漸接觸對象的内置方法。

對象方法的調用文法格式為:

對象.方法()           

4.2.1 字元串對象的方法

你首先要知道在 Python 中任意一個資料都是對象,那聲明一個字元串變量之後,那這個字元串變量就是一個對象,是對象就會有對象的方法。字元串常用的方法有:

  1. lower 将字元串轉換成小寫
  2. upper 将字元串轉換成大寫
  3. title 将字元串首字母大寫,其餘小寫
  4. rstrip 移除字元串右側空白
  5. lstrip 移除字元串左側空白
  6. strip 移除字元串兩側空白

字元串大小寫說明

my_str = "good moring"
my_strU = my_str.upper()
my_strL = my_str.lower()
my_strT = my_str.title()

# 大寫
print(my_strU)
# 小寫
print(my_strL)
# 首字母大寫
print(my_strT)           

輸出結果對應如下:

GOOD MORING
good moring
Good Moring           

移除字元串開始或者結尾的空白是非常有用的方法,該内容留給你自己來完成。代碼可以參考

my_str.strip()

4.2.1 快速擷取系統内置方法

在實際開發中,我們很難記住一個對象的所有方法,對于橡皮擦來說編寫代碼的時候也要借助于手冊,方法太多不可能記住的,常用的記住就好了,那如何查詢一個對象的所有方法呢,用到的是一個内置函數

dir

例如,你想知道一個字元串對象的所有方法,可以編寫如下代碼。

my_str = "good moring"
print(dir(my_str))           

代碼運作之後,會得到如下内容,其中紅框内容就是剛才提及到的方法。

4. 清單一學完,Python 會一半,滾雪球學 Python四、清單一學完,Python 會一半

對于某個方法是如何使用的,可以調用之前學習的

help

内置函數進行學習,文法格式如下:

help(對象.方法)

例如擷取字元串對象的

rfind

方法。

my_str = "good moring"

print(help(my_str.rfind))           

結果如下,稍微閱讀一下即可了解 rfind 方法的使用方式。

4. 清單一學完,Python 會一半,滾雪球學 Python四、清單一學完,Python 會一半

檢視一下清單的方法

因為後續将繼續學習清單的方法,是以先進行簡單展示。

my_list1 = ["a","b"]
print(dir(my_list1))           

本篇部落格後續内容将對紅框部分的方法進行講解,肯定有人會關心沒有在紅框裡面的哪些以兩個\_開頭的是啥,它們也是方法,不過現在還不到學習它們的時候。

4. 清單一學完,Python 會一半,滾雪球學 Python四、清單一學完,Python 會一半

4.3 通過方法增删清單元素

4.3.1 清單追加元素

在操作清單時候經常會出現如下場景,需要往已經存在的清單中追加元素,例如原清單有一個元素,現在想追加到兩個。如果直接設定,會出錯提示索引值超過清單長度,請注意該錯誤在操作清單時經常出現。

my_list = ["apple", "orange", "grape"]
my_list[3] = "pear"           

該錯誤提示為

IndexError: list assignment index out of range

,這裡需要注意下,在學習或編寫代碼的過程中要熟悉一些常見的錯誤,以便當這些錯誤出現的時候能夠快速發現原因。

在清單追加元素,Python 中清單對象内置了一個方法,具體格式如下。

my_list.append("新增元素")           

例如接下來可以聲明一個空清單,然後往該清單追加元素。

my_list = []
my_list.append("pear")
my_list.append("apple")
my_list.append("orange")

print(my_list)           

通過 append 方法,每次都會在清單的末端追加一個元素,用該方法就可以無限制的将清單擴充下去。

4.3.2 清單插入元素

append 方法是在清單末尾固定插入元素,如何在任意位置插入元素是一個新的方法,名稱叫做 insert,文法格式如下:

my_list.insert(索引位置,"新增元素")           

嘗試在索引 1,索引 2,索引 0 的位置插入元素,代碼如下:

my_list = ["pear", "apple", "orange"]
my_list.insert(0, "插入")
print(my_list)
my_list = ["pear", "apple", "orange"]
my_list.insert(2, "插入")
print(my_list)           

這裡需要注意下當索引超過清單長度時,預設插入末尾。

4.3.3 删除清單元素

之前的内容中已經介紹過一種删除清單元素的方式,通過關鍵字

del

,該方式存在一個問題就是删除元素之後沒有擷取到被删除的元素。接下來的方法将解決該問題,你将能擷取到被删除的值,該方法是

pop

,文法格式如下:

item = my_list.pop()
item = my_list.pop(索引)           

注意在 pop 方法中可以攜帶一個索引值,直接删除索引位置的元素,如果沒有預設删除最後一項。變量

item

用于擷取被删除的值。注意該方法删除元素的時候,索引不能超過清單長度。

my_list = ["pear", "apple", "orange"]
item = my_list.pop()
print(item)

print("删除元素之後")
print(my_list)           

代碼運作結果為:

orange
删除元素之後
['pear', 'apple']           

pop

方法是按照索引删除元素,你還可以直接删除指定元素,具體方法是

remove

,該方法的文法格式如下。

my_list.remove(待删除元素内容)           

注意 remove 删除元素之後,不會傳回被删除的元素,還存在一個問題是如果待删除的元素不在清單中,會提示代碼錯誤。

如果待删除的元素在清單中出現多個,預設隻删除第一個,如果想要删除多個,需要用到後面的循環知識。

4.4 清單排序

對于清單除了增删改以外還會涉及排序相關内容,該操作對于清單對象也非常簡單,使用固定的方法即可。

4.4.1 sort 排序

sort 方法可以對清單元素進行排序,預設從小到大,當然也可以修改成從大到小,該方法一般用于純數字或者純英文字元清單排序,如果清單中的元素資料類型比較複雜,該方式不在适用,需要注意一下。

sort 方法的文法格式如下:

my_list.sort()           

聲明一個所有元素都是數字的清單,然後進行排序。

my_list = [3, 4, 1, 2, 9, 8, 7]
print("排序前:", my_list)

my_list.sort()
print("排序後:", my_list)           

輸出結果如下:

排序前: [3, 4, 1, 2, 9, 8, 7]
排序後: [1, 2, 3, 4, 7, 8, 9]           

如果希望按照從大到下進行排序,隻需要增加參數(參數概念後面還會繼續學習)

reverse=True

即可。

my_list = [3, 4, 1, 2, 9, 8, 7]
print("排序前:", my_list)

my_list.sort(reverse=True)
print("排序後:", my_list)           

英文字元串的排序結果希望你可以進行一下測試,需要注意對英文字元清單進行排序,建議将字元串英文全部修改為小寫。

注意上述

sort

方法排序之後是對原清單中元素順序修改,即修改的是

my_list

清單的順序,如果不想修改原清單的順序,想要新生成一個清單,需要用到的是下述方法。

4.4.2 sorted 排序

sort 排序将造成清單元素順序永久修改,很多時候并不需要修改原清單,這種情況下需要借助 sorted 函數,注意 sorted 是一個内置函數,并不是清單對象的一個方法,也就是說 sorted 可以用于很多對象的排序。

sorted 函數的文法格式如下:

sorted(待排序清單) # 正序,從小到大
sorted(待排序清單,reverse=True) # 逆序,從大到小           

該函數使用之後會傳回一個新的清單,你可以用新變量接收一下,具體代碼如下:

my_list = [3, 4, 1, 2, 9, 8, 7]
print("排序前:", my_list)

new_list = sorted(my_list)
print("排序後:", my_list)
print("排序後:", new_list)           

注意排序後新變量為

new_list

對于原

my_list

清單中元素的順序并無影響。

4.5 清單其它方法

4.5.1 清單檢索元素索引

通過 index 方法可以擷取某内容在清單中第一次出現的索引值,格式如下:

索引值 = my_list.index(待查找值)           

該方法注意如果沒有檢索到索引值,會提示錯誤。

my_list = [3, 4, 1, 2, 9, 8, 7]
ke = my_list.index(4)
ke = my_list.index(10)
print(ke)           

4.5.2 清單統計元素出現次數

通過 count 方法可以擷取清單特定元素出現的次數,它的文法格式如下:

次數 = my_list.count(待查找值)           

該方法同樣當在清單中找不到待查找值時會傳回 0。

my_list = [3, 4, 3, 2, 3, 8, 7]
nums = my_list.count(3)

print(nums)           

4.5.3 清單轉換為字元串

通過 join 方法可以将清單中的所有元素組合成一個字元串,文法格式如下:

連接配接字元串.join(待轉換清單)           

該方法其實準确的說應該是 字元串對象的一個方法。

my_list = ["pear", "apple", "orange"]
my_str = "#".join(my_list)

print(my_str)           

該方法在使用的時候需要注意,清單中所有元素都必須是字元串,否則會出現

expected str instance, int found

錯誤。

4.5.4 清單追加清單

append 方法可以給清單追加元素,extend 可以給一個清單追加一個清單,相當于将兩個清單進行連接配接。

清單1.extend(清單2)           

注意追加的清單預設在原清單末尾追加,是以追加之後原清單中的元素已經發生了改變。

my_list1 = [1, 2, 3]
my_list2 = [4, 5, 6]

my_list1.extend(my_list2)
print(my_list1)           

4.6 多元清單

清單中的元素可以為任意資料類型,故清單嵌套清單也是可以的。

my_list = [1,2,3,[4,5,6]]           

該方法需要注意擷取嵌套清單中的元素的時候,需要按照層級擷取,例如希望擷取元素 5,首先要擷取最外層清單中的第 4 項元素,即

my_list[3]

,然後擷取到它之後再擷取它索引位置為 1 的元素,即

my_list[3][1]

,具體代碼可以自行嘗試,也可以在内層清單中在嵌套清單,無限循環下去。

4.7 特殊的清單字元串

現在回過頭來再看一下字元串格式為

"abcsdasa"

,可以将字元串看成一個字元組成的清單,一般也稱作字元序列(有順序的清單),字元串也不能完全等價于清單,因為字元串中不能修改單個元素。

4.7.1 字元串索引與切片

字元串也可以通過索引通路某個元素,索引使用方式與清單一緻,例如下述代碼:

my_str = "abcdefghi"
print(my_str[5])
print(my_str[4])
print(my_str[3])           

清單切片也可用于字元串,相當于擷取字元串子串。

4.7.2 可用于字元串的部分函數和方法

清單相關的内置方法,例如 len、max、min 也可用于字元串,具體内容你可自行嘗試。

4.7.3 将字元串轉換成清單

通過内置函數 list 可以将字元串轉換成清單,也就是将字元串中每個字元都拆解開。

my_str = "abcdefghi"
print(list(my_str))           

輸出内容為:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']           

4.8 這篇部落格的總結

清單在 Python 基礎部分屬于非常重要的資料類型,在寫這篇部落格的時候也在考慮是否将所有内容都包含進去,結果發現内容太多了,很多都與後面産生的極強的關聯性,在本篇部落格中也初步了解了面向對象的一些最簡單概念。

本篇部落格省略的部分,後續将補充完整,具體内容先埋個坑。

  • 深複制與淺複制
  • 位址的概念
  • in、not in 表達式
  • is、is not 表達式
  • enumerate 對象

希望在講解這些内容的時候,還能看到堅持學習的你的留言。

最後一碗毒雞湯

隻要我肯努力 就沒有搞不砸的事情 O(∩_∩)O 哈哈~ 👗👗

💎💎💎💎💎💎💎💎💎💎💎

今天是持續寫作的第 3/100 天。

如果你有想要交流的想法、技術,歡迎在評論區留言。