滾雪球學 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 中任意一個資料都是對象,那聲明一個字元串變量之後,那這個字元串變量就是一個對象,是對象就會有對象的方法。字元串常用的方法有:
- lower 将字元串轉換成小寫
- upper 将字元串轉換成大寫
- title 将字元串首字母大寫,其餘小寫
- rstrip 移除字元串右側空白
- lstrip 移除字元串左側空白
- 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))
代碼運作之後,會得到如下内容,其中紅框内容就是剛才提及到的方法。
對于某個方法是如何使用的,可以調用之前學習的
help
内置函數進行學習,文法格式如下:
help(對象.方法)
例如擷取字元串對象的
rfind
方法。
my_str = "good moring"
print(help(my_str.rfind))
結果如下,稍微閱讀一下即可了解 rfind 方法的使用方式。
檢視一下清單的方法
因為後續将繼續學習清單的方法,是以先進行簡單展示。
my_list1 = ["a","b"]
print(dir(my_list1))
本篇部落格後續内容将對紅框部分的方法進行講解,肯定有人會關心沒有在紅框裡面的哪些以兩個\_開頭的是啥,它們也是方法,不過現在還不到學習它們的時候。
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 天。
如果你有想要交流的想法、技術,歡迎在評論區留言。