1、list 列表
有序集合,隨時增刪。包含的數據類型可以不同:整數、浮點數、字符串、list、tuple、dict、set、bool、空值、常量。
list = [12, 'Yummy', 19.2, [1, 3, 'zhan']]
-
list名為列表,相當於一個數組
-
list列表是有序的,其中的每個元素都分配一個位置索引,索引值從0開始
-
list的長度是自動變化的
-
list列表元素不必都是同一種類型
-
list列表可以進行截取、組合、修改、增加等操作
-
list列表中的元素用中括號[]來表示
函數:len()、append()、remove()移除列表中某個值的第一個匹配項、insert()、pop()、sort()、del、list()、reverse()、index()從列表中找出某個值第一個匹配項的索引位置、count()統計某個元素在列表中出現的次數、extend()在列表末尾一次性追加另一個序列中的多個值(用新列表擴展原來的列表)。
刪除:del list1[0]
元祖轉換為列表:tuple-->list list(tuple)
append(value)把元素添加到末尾、insert(i,value)把元素添加到任意位置;pop()刪除末尾元素、pop(i)刪除指定位置的元素、remove(value)直接刪除某個元素值;list1.sort()對元素進行排序
取值:list1[0]、list1[4:]、list1[:-4]、list1[2:-3],嵌套:list里面可以嵌套list從而形成類似於二維、三維、多維數組的。
2、tuple 元組
tuple = (3.14,'yu',[3,1,2])
tuple[1] = 'a'
python內置的數據類型,有序列表,一旦初始化,無法修改。tuple不可變,所以代碼更安全。可以看做是一種“不變”的List,即tuple一旦創建完畢,就不能修改了。
Tuple元組中的元素用小括號()來表示。
3、dict 詞典
d={'Michael': 95, 'Bob': 75, 'Tracy': 85}
鍵值對(key-value)方式存儲,查找速度快;dict的key必須是不可變對象(字符串、數字、元祖);相當於一個HashMap。
-
Dictionary字典查找速度快,但是代價是耗費的內存大。List相反,占用內存小,但是查找速度慢。這就好比是數組和鏈表的區別
-
Dictionary字典沒有順序,而List是有序的集合,所以不能用Dict來存儲有序集合
-
Dictionary字典的Key不可變,Value可變。一旦一個鍵值對加入dict后,它對應的key就不能再變了,但是Value是可以變化的
-
Dictionary字典中的Key不可重復
-
Dictionary字典中的元素用中花括號{}來表示
4、set 無序集合、key不重復
set = set(['A','B','C','B','C'])
要創建一個set,需要提供一個list作為輸入集合。
無索引、無切片、作為一個無序的集合,set不記錄元素位置或者插入點。因此,set不支持 indexing, slicing, 或其它類序列(sequence-like)的操作
set和dict類似,也是一組key的集合,但不存儲value。由於key不能重復,所以,在set中,沒有重復的key。
-
set就像是把Dict中的key抽出來了一樣,類似於一個List,但是內容又不能重復
-
set集合是無序的
-
set集合通過調用set()方法創建
5、總結:
- 1、list、tuple是有序列表;dict、set是無序列表
- 2、list元素可變、tuple元素不可變
- 3、dict和set的key值不可變,唯一性
- 4、set只有key沒有value
- 5、set的用途:去重、並集、交集等
- 6、list、tuple:+、*、索引、切片、檢查成員等
- 7、dict查詢效率高,但是消耗內存多;list、tuple查詢效率低、但是消耗內存少
6、Python 的參數傳遞
- 對於不可變對象作為函數參數,相當於C系語言的值傳遞;
- 對於可變對象作為函數參數,相當於C系語言的引用傳遞。
tuple,number等為不可變對象,list等對象是可變對象。但是這樣理解從結果上理解是正確的,從原理上說,前面已經說過了,python一切對象傳遞的都是地址,不同的是,在函數內部轉換的過程不一樣。
代碼解釋:
在程序內部,test_list的地址和test_number的地址都傳遞都函數test中去。
執行.pop()操作的時候,是在原地址上進行操作,因此會改變原來的值。
執行+1操作的時候,test_number + 1 = 2,開辟了一段內部地址指向了2,局部地址(局部對象)指向了這個新對象2,原來的test_number並沒有改變,因此原來的test_number並不會改變。
同理:如果將test_list.pop()改成 test_list = [1],那么原來的test_list的地址也不會改變,即print test_lists仍然會打印出 [1,2,3]。
def test(test_list, test_number): test_list.pop() test_number = test_number + 1 # 參數分別為list類型和number類型, 也就是一個是可變對象,一個是不可變對象 test_list = [1, 2, 3] test_number = 1 test(test_list, test_number) print test_list # 輸出[1, 2] print test_number # 輸出[1]
舉例說明:
show me the code
def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
這段代碼是初學者最容易犯的錯誤,用可變(mutable)對象作為參數的默認值。函數定義好之后,默認參數 a_list
就會指向(綁定)到一個空列表對象,每次調用函數時,都是對同一個對象進行 append 操作。因此這樣寫就會有潛在的bug,同樣的調用方式返回了不一樣的結果。
>>> print bad_append('one')
['one']
>>> print bad_append('one')
['one', 'one']
而正確的方式是,把參數默認值指定為None,指定一個新的地址,保存變量。
def good_append(new_item, a_list=None):
if a_list is None:
a_list = []
a_list.append(new_item)
return a_list