0.寫在前面
快開學(xué)了瑣事比較多,就更新的慢了一些巩割。開學(xué)以后也會(huì)邊學(xué)邊寫裙顽,不定時(shí)更新,灰常感謝大家的支持和鼓勵(lì)宣谈!也希望大佬們不吝賜教愈犹,多提提意見or建議,有什么好的學(xué)習(xí)資源的話也希望能分享一下闻丑,感激不盡甘萧!
這篇文章第一版中字典的BIF部分還沒寫完萝嘁,我會(huì)盡快寫完補(bǔ)上,因?yàn)閯倓偙恍』锇樘嵝寻l(fā)現(xiàn)自己的wiki還沒有寫扬卷。牙言。。
1. 元組(tuple)——一個(gè)上了鎖的列表
“一切有權(quán)力的人都容易濫用權(quán)利怪得≡弁鳎“ ——孟德斯鳩
在學(xué)完列表之后,發(fā)現(xiàn)列表真的是很強(qiáng)大徒恋。這種極大的靈活性無疑帶來了很多便利蚕断,但是站在安全的角度上講, 卻不利于保護(hù)數(shù)據(jù)入挣。于是元組應(yīng)運(yùn)而生亿乳。
元組是一種不可改變的類型,一旦定義了元組径筏,里面的任何一個(gè)元素都無法再更改葛假。元組(tuple)和列表(list)在使用上十分相似,因此我只是簡(jiǎn)記一下它們不同之處滋恬。關(guān)于列表的相關(guān)內(nèi)容可參見文末的上一篇文章聊训。
1.1 建立元組
在建立列表時(shí),只需要中括號(hào)[ ]
來創(chuàng)建恢氯。對(duì)應(yīng)的带斑,建立元組一般只需用小括號(hào)( )
即可,元素之間用逗號(hào)分隔勋拟。
>>> tuple1 = (1 , '嘻嘻嘻' , [1,2,3] , int)
>>> type(tuple1)
<class 'tuple'>
注意勋磕!小括號(hào)( )
不是元組的特征,逗號(hào)才是8颐摇朋凉!
>>> temp = ( 1 )
>>> type(temp)
<class 'int'>
會(huì)發(fā)現(xiàn),即使加上了小括號(hào)醋安,temp仍然是整型!
>>> temp = 1 , int , '嘻嘻嘻' , int
>>> type(temp)
<class 'tuple'>
因此墓毒,逗號(hào)才是元組的標(biāo)志吓揪!However,中括號(hào)[]
確是list的標(biāo)志所计!
>>> temp = [ 1 ]
>>> type(temp)
<class 'list'>
不過用小括號(hào)創(chuàng)建空元組是可行的柠辞。
>>> temp = ()
>>> type(temp)
<class 'tuple'>
那么問題來了,要建立只有一個(gè)元素的元組怎么辦呢主胧?可以這樣:
>>> temp = (1,)
>>> type(temp)
<class 'tuple'>
>>> len(temp)
1
甚至可以進(jìn)一步簡(jiǎn)化為
>>> temp = 1,
>>> type(temp)
<class 'tuple'>
1.2 元組切片(slice)
這部分元組和列表是完全一樣的叭首,因此不多贅述习勤。Python處理元組仍然是“貼標(biāo)簽”的方式。
>>> tuple1 = (1 , '嘻嘻嘻' , [1,2,3] , int)
>>> tuple1[3]
<class 'int'>
>>> tuple1[2:]
([1, 2, 3], <class 'int'>)
>>> tuple2 = tuple1[:] #copy a tuple
>>> print(tuple2)
(1, '嘻嘻嘻', [1, 2, 3], <class 'int'>)
1.3 元組不可添加焙格、刪除图毕、修改元素
若按列表的方式去試圖修改元組會(huì)報(bào)錯(cuò)。
>>> tuple1 = (1 , '嘻嘻嘻' , [1,2,3] , int)
>>> tuple1.append('可以添加嗎眷唉?')
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
tuple1.append('可以添加嗎予颤?')
AttributeError: 'tuple' object has no attribute 'append'
>>> tuple1[1] = '可以修改嗎?'
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
tuple1[1] = '可以修改嗎冬阳?'
TypeError: 'tuple' object does not support item assignment
1.4 操作符&比較大小
這部分和列表是完全相同的蛤虐,+
,*
,in
等操作符可用于元組,元組之間可比較大小肝陪,比較的方法和列表相同驳庭。
>>> temp = 1 , 2
>>> temp * 3
(1, 2, 1, 2, 1, 2)
>>> 1 in temp
True
Tips: 變相"修改"元組中元素
>>> tuple1 = (1 , '嘻嘻嘻' , [1,2,3] , int)
>>> tuple1 = tuple1[:2] + ('加一個(gè)元素',) + tuple1[2:]
>>> print(tuple1)
(1, '嘻嘻嘻', '加一個(gè)元素', [1, 2, 3], <class 'int'>)
這樣,我們就在tuple1里加了一個(gè)元素進(jìn)去氯窍。這是怎么做到的呢饲常?事實(shí)上,只是巧妙的運(yùn)用了元組的拼接荞驴〔唤裕看似是tuple1中多了一個(gè)元素,其實(shí)是我們創(chuàng)建了一個(gè)新的元組熊楼,再把tuple1
這個(gè)標(biāo)簽貼到了新元組上而已霹娄。類似地,可用切片間接地“刪除”元組里的元素鲫骗。
無論如何元組是不可改變的犬耻!
也可以利用函數(shù)list()
將元組轉(zhuǎn)換成列表,再對(duì)其進(jìn)行修改执泰。
2. 字典 (dictionary)—— A kind of mapping
列表中的元素是有序的枕磁,并且有屬于自己的索引值。調(diào)取列表中的元素只能通過其索引值來實(shí)現(xiàn)术吝。而“字典”提供了一種key
+value
的方式计济,給每個(gè)元素一個(gè)標(biāo)簽,這樣我們便可以通過該表現(xiàn)來調(diào)取元素排苍。
2.1 創(chuàng)建字典
創(chuàng)建字典最簡(jiǎn)單的方式是用大括號(hào){ }
沦寂,格式為{key1: value1 , key2: value2 , ...}
,調(diào)取時(shí)直接通過object[key]
的方式淘衙。
>>> dict1 = {'目標(biāo)':'減肥传藏!減肥!' , '口號(hào)':'燃燒我的卡路里!'}
>>> print('我們的口號(hào)是:' + dict1['口號(hào)'])
我們的口號(hào)是:燃燒我的卡路里毯侦!
利用dict()函數(shù)
dict()
函數(shù)有兩種用法哭靖,一種是dict(mapping)
,其中mapping可以用元組或著列表的形式給出侈离。
>>> dict1 = dict((('目標(biāo)','減肥试幽!減肥!') , ('口號(hào)','燃燒我的卡路里霍狰!')))
>>> print(dict1)
{'目標(biāo)': '減肥抡草!減肥!', '口號(hào)': '燃燒我的卡路里蔗坯!'}
hhh看上去好多括號(hào)康震,主要原因是用這種方式的話dict只能有一個(gè)參數(shù),所以必須用()
或者[]
給括起來喏宾濒。
另一種方式是用關(guān)鍵字參數(shù)dect(key1=value1, key2=value2, ...)
腿短,注意key是不能加引號(hào)的!
>>> dict2 = dict(目標(biāo)='減肥绘梦!減肥橘忱!' , 口號(hào)='燃燒我的卡路里!')
>>> print(dict2)
{'目標(biāo)': '減肥卸奉!減肥钝诚!', '口號(hào)': '燃燒我的卡路里!'}
2.2 常用操作
在字典中添加元素可以直接采用object[a new key]=value
的方式榄棵。
>>> dict2['方式'] = '每天跑步十公里凝颇!'
>>> dict2
{'目標(biāo)': '減肥!減肥疹鳄!', '口號(hào)': '燃燒我的卡路里拧略!', '方式': '每天跑步十公里!'}
刪除元素的話采用del object[key]
的方式即可瘪弓。
>>> dict2 = {'目標(biāo)': '減肥垫蛆!減肥!', '口號(hào)': '燃燒我的卡路里腺怯!', '方式': '每天跑步十公里袱饭!'}
>>> del dict2['目標(biāo)']
>>> dict2
{'口號(hào)': '燃燒我的卡路里!', '方式': '每天跑步十公里呛占!'}
2.3 常用的BIF
占個(gè)位置先虑乖,日后補(bǔ)上。栓票。。
3. 集合(set)
Python中的集合和數(shù)學(xué)中的集合的性質(zhì)是相同的,即無序性和互異性走贪。
3.1 建立集合
創(chuàng)立集合也有兩種方式佛猛。一是用大括號(hào){}
,當(dāng)大括號(hào)里只有value而沒有key時(shí)坠狡,所創(chuàng)建的數(shù)據(jù)類型即為集合继找。
>>> set1 = {1 , 2 , int , '嘻嘻嘻'}
>>> type(set1)
<class 'set'>
另一種方式是利用set()
函數(shù),將列表或元組轉(zhuǎn)換成集合逃沿。
>>> set([1 , 1 , 2 , '嘻嘻嘻' , int])
{1, 2, '嘻嘻嘻', <class 'int'>}
有趣的是婴渡,原來列表中的兩個(gè)"1"變成集合后只剩一個(gè)了。
問:如何刪除列表中重復(fù)的值凯亮?
>>> num1 = [1,2,3,4,5,4,3,2,1]
>>> num1 = list(set(num1))
>>> print(num1)
[1, 2, 3, 4, 5]
3.2 訪問集合中的值
集合中的元素是無序的边臼,因此若試圖通過索引值來訪問集合中的值會(huì)報(bào)錯(cuò)。
>>> set1 = {1 , 2 , int , '嘻嘻嘻'}
>>> set1[1]
Traceback (most recent call last):
File "<pyshell#85>", line 1, in <module>
set1[1]
TypeError: 'set' object does not support indexing
可以利用for
循環(huán)來讀取集合中的值假消,舉個(gè)簡(jiǎn)單的例子:
>>> set1 = {1 , 2 , int , '嘻嘻嘻'}
>>> for i in set1:
print(i , end=' ')
1 2 嘻嘻嘻 <class 'int'>
3.3 集合的運(yùn)算
設(shè)A柠并、B是兩個(gè)集合,則集合的運(yùn)算可以通過以下方式進(jìn)行:
運(yùn)算符 | 意義 |
---|---|
A <= B | 子集測(cè)試 :A 是B的子集 |
A < B | 子集測(cè)試 :A 是B的真子集 |
A >= B | 超集測(cè)試 :B 中所有的元素都是 A 的成員 |
A > B | 等價(jià)于 B < A |
A | B | 取并集 |
A & B | 取交集 |
A - B | 差分操作:在 A 中存在富拗,在 B 中不存在的元素 |
A ^ B | 對(duì)稱差分操作:A "或" B 中的元素臼予,但不是 A 和 B 共有的元素 |
例如
>>> a={1,2,3}
>>> b={1,3,4}
>>> c={1,2,3,4}
>>> a & b
{1, 3}
>>> a | b
{1, 2, 3, 4}
>>> a - b
{2}
>>> a<c
True
3.4 向集合中添加、刪除元素
添加或刪除集合中的元素可分別使用.add()
和.remove()
函數(shù)啃沪。
>>> set1 = {1 , 2 , int , '嘻嘻嘻'}
>>> set1.add(1e5)
>>> print(set1)
{100000.0, 1, 2, '嘻嘻嘻', <class 'int'>}
>>> set1.remove('嘻嘻嘻')
>>> print(set1)
{100000.0, 1, 2, <class 'int'>}
3.5 不可變集合(frozen set)
若想定義一個(gè)類似與元組一樣不可變的集合粘拾,可以利用frozenset()
函數(shù)。顧名思義创千,不可變集合的元素是無法進(jìn)行修改的缰雇。
>>> set2 = frozenset([1 , int , '嘻嘻嘻'])
>>> set2.add(0)
Traceback (most recent call last):
File "<pyshell#97>", line 1, in <module>
set2.add(0)
AttributeError: 'frozenset' object has no attribute 'add'
3.6 關(guān)于可哈希(hashable)
如果一個(gè)對(duì)象在自己的生命周期中有一哈希值(hash value)是不可改變的,那么它就是可哈希的(hashable)的签餐,因?yàn)檫@些數(shù)據(jù)結(jié)構(gòu)內(nèi)置了哈希值寓涨,每個(gè)可哈希的對(duì)象都內(nèi)置了hash方法,所以可哈希的對(duì)象可以通過哈希值進(jìn)行對(duì)比氯檐,也可以作為字典的鍵值和作為set函數(shù)的參數(shù)戒良。所有python中所有不可改變的的對(duì)象(imutable objects)都是可哈希的,比如字符串冠摄,元組糯崎,也就是說可改變的容器如字典,列表不可哈希(unhashable)河泳。我們用戶所定義的類的實(shí)例對(duì)象默認(rèn)是可哈希的(hashable)沃呢,它們都是唯一的,而hash值也就是它們的id()拆挥。
簡(jiǎn)單來講薄霜,Python中有些數(shù)據(jù)類型是不可變的某抓,比如字符串str、元組tuple惰瓜、對(duì)象集objects否副、不可變集合frozenset,稱為可哈希(hashable)的數(shù)據(jù)類型崎坊;也有些數(shù)據(jù)類型是可變的备禀,比如字典dict,列表list奈揍,集合set曲尸,稱為不可哈希(unhashable)的數(shù)據(jù)類型。
集合和字典的存儲(chǔ)方式都是保存元素的哈希值男翰,因此集合和字典都是無序的另患,并且集合中哈希值相同的元素(相同元素)便保存為一個(gè),這也便是集合的互異性(或者叫唯一性)奏篙。因此柴淘,集合無法儲(chǔ)存不可哈希的數(shù)據(jù)類型。舉個(gè)例子:
>>> { [1,2] , int , '嘻嘻嘻'}
Traceback (most recent call last):
File "<pyshell#105>", line 1, in <module>
{ [1,2] , int , '嘻嘻嘻'}
TypeError: unhashable type: 'list'
這樣創(chuàng)建的集合會(huì)報(bào)錯(cuò)秘通,提示列表list是不可哈希的为严。同樣集合中的元素不能是集合,但是可以是不可變集合frozenset肺稀。
>>> set1 = set([1,2,3,4]) #創(chuàng)建一個(gè)集合
>>> set2 = frozenset([1,2,3,4]) #創(chuàng)建一個(gè)不可變集合
>>> {set1}
Traceback (most recent call last):
File "<pyshell#111>", line 1, in <module>
{set1}
TypeError: unhashable type: 'set'
>>> {set2}
{frozenset({1, 2, 3, 4})}
往期回顧
Python學(xué)習(xí)筆記(0)之Hello,python!
Python學(xué)習(xí)筆記(1)之列表list