決戰Python之巔(七)
前言
本篇呢,先補充介紹一下字串資料型別,然後介紹雜湊、字典、元祖、集合。由於幾種資料型別的函式比較多,我這裡就不一一列出來了,有興趣的同學可以去看原始碼。
…原始碼怎麼看?開啟Pycharm,新建一個python檔案,輸入你要使用的函式,然後按住鍵盤上的ctrl鍵(winows系統),然後滑鼠指標移動到函式名上,點選即可。
知識回顧
1.字串知識補充
前面我們已經學習過也使用過了字串,那字串有哪些特性呢?
1.有序;2.不可變;
有序
有序很好理解吧,就是你初始化了一個字串:
name = 'Kris'
每次你呼叫name的時候計算機不會給你’risK’,或者’sKir’,只會按照你提供的順序來。
不變性
這個可能有的同學會有疑惑,說我初始化了一個name:
name = 'Kris'
然後我又這樣:
name = 'Alex'
那不是變了嗎? 變沒變,我們看一下id就知道了:
事實上,我們在進行name的初始化時,系統開闢了一個記憶體空間來存放Kris,當我們對name重新賦值時,系統又開闢了一個記憶體空間來存放新的值,原先的那個記憶體空間還在,並沒有改變,只是現在name指向了新的記憶體空間。
這就有了另一個問題:如果我沒事幹,給name賦了很多次值,假如說有成千上萬次,那麼記憶體不會爆掉嗎? 在實際中,並不會,Python有一個“垃圾回收”機制,就是說每隔一段預設的時間,它會把不再用到的記憶體空間清理回收。具體的細節在後面的章節中會有。
下面是字串的函式:
具體的功能試一下就知道了。
元組
下面介紹一個新的“列表”,元組。它跟列表差不多,只不過一旦建立了就不可修改,所以又叫只讀列表(就是隻能讀取不能寫入)。
因此,它跟字串一樣,也是一種不可變的資料型別。但是,事情遠遠沒有這麼簡單,這裡說的不可變只是相對的,只限於它自己的元素,什麼意思呢:
我定義了一個名叫name的元組(元組使用小括號(),列表使用中括號[],別搞混了~),然後我想將第一個元素改為99,會報錯,因為是不可變的。但是我將元組的最後一個元素,一個小列表的第一個元素改為99,卻是可以的。大家可以想象是為什麼?
----------------------------------------就這樣過了5分鐘-----------------------------------------
我們知道,列表是可變的,而現在元組裡嵌套了一個小列表,就相當於一個大杯子裡放了一個小杯子,因為大杯子的特性導致這個小杯子不能變,但是小杯子裡的東西是可以改變的,小杯子裡的東西是單獨存在的個體。 這裡注意不要跟列表的知識搞混了。
也就是說,元組裡的元素的記憶體地址不能變,但這個記憶體地址指向的記憶體空間裡的東西是可以改變的,就像上面的元組裡嵌套了一個列表,元組的元素不能變,但是列表的元素可變。
功能
切片
索引index
count
這三個功能與列表類似,我就不再贅述(這句話好像出現過很多次了…恐怖如斯)。
至於元組的用處麼…
Hash
上面我們講了兩種不可變的資料型別,一是字串,二是元組,還有一種是數字,這個都能理解吧。
那麼Hash(雜湊)是什麼呢?
最後一句,將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。
我的理解是,將一些訊息通過函式計算變成一堆固定長度的數字…效果如下:
Hash是根據值的一些特徵來計算的,這就要求這個值是不能變的,所以只有字串、數字、元組可以被雜湊,列表不行。
那這有什麼用呢?
前兩個我也不太清楚,有興趣的可以去研究下。密碼驗證我可以稍微講一下,幾乎所有的登入都是用的Hash。密碼驗證是個什麼過程呢? 假如你註冊一個QQ號,要設定密碼吧,設定完之後系統會將你的密碼進行雜湊,然後將得到的值存入資料庫,而不是將你的密碼直接存進去。當你登入時,會將你輸入的密碼進行雜湊,然後與資料庫中的比對,比對通過就登陸成功。
Hash還有一個特性,就是不可逆。意思是當一個值進行hash運算,得到的雜湊值不可能也不能夠反推出初始值,這樣你就不用擔心萬一哪天哪個工程師拿到你儲存密碼的資料庫,你的賬號會被洩露,他只拿到一堆數字,根本不能反推出你的密碼。
Hash有一個缺點,就是說兩個完全不同的資料,他可能會雜湊出同一個值,這就需要我們每次使用hash時都要考慮這個問題。
字典
之前我們講過列表,列表有什麼用呢? 誒,假如我現在要求你建立一個可以存取的,包含你的所有同事、或者同學姓名的這麼一個東西,你可能會想到列表。
那現在我需要不僅可以存取姓名,還可以存取他們的年齡、手機號碼等等,那列表就無法滿足我的這個需求。這裡我們介紹一個新的資料型別,字典。
與我們實際生活中使用的字典一樣,你需要通過這個字來找到這個字所有相關的內容,而在Python中,我們將這個字稱為key,這個字的相關內容稱為value,字典中存放的就是key : value這樣的組合(注意字典是用大括號括起來):
字典有這幾個特性:
我們著重講一下無序吧,查詢速度快會在後面講。由前面所學的可以知道,list是有序的,字串也是有序的,它們都有index索引值。而字典沒有,它是無序的。
下面是一些基本用法:
查詢
查詢還有另一種方法但是這裡不講,那種方法假如說查詢的內容不存在,會報錯,所以一般用in。
其他用法
dict迴圈
這裡我也只介紹一種迴圈:
for key in info:
print(key,info[key])
這樣就能遍歷輸出所有的key以及對應的value。
集合
集合比較有意思,原理跟我們高中學的知識差不多。
首先,集合是一個無序的,不重複的資料型別。它有兩個主要作用,一是去重,而是關係測試。
去重以及其他函式
最後為什麼會報錯呢?集合元素的特徵之一就是確定性,也就是要求是不可變的,可以被雜湊的。其他兩個特性是互異性和無序性。
關係測試
1.交集
取出兩個集合的交集:
2.差集
3.並集
還有一個寫法是:s1 | s2
這裡補充一個:
對稱差集
上面的差集只把某一個集合的元素取出來,現在我要取出兩個集合的差集。
最後的話是集合的一個包含關係,就是判斷一個集合是不是另個一個集合的子集或者父集(也叫超集)。