十八問,認識Python序列
- 2020 年 1 月 3 日
- 筆記
序列是Python中的重要數據結構,序列包括字符串,列表,元組。 大部分讀者朋友學習Python的時候都會找本書或者資料從頭看到尾,這次我們換一個思路,問答式的方式,可能讓我們精力更集中,下面開始我們的提問:
1.什麼是序列?
序列是將元素按照順序排列,通過索引(下標)訪問; 字符串、列表、元組都屬於序列。
2.能直觀描述下嗎?
直接上圖:

序列中的每個元素按順序排列,使用索引進行訪問,索引分為正負索引;
3.具體如何訪問,正負索引是不是有點多餘?
舉一個栗子,字符串:msg ='helloworld',在jupyter下操作如下:
msg = 'helloworld' #獲取第一個元素 print(msg[0]) #獲取最後一個? print(msg[-1]) #獲取第3個元素 print(msg[2]) #獲取第12個元素 print(msg[11])
輸出結果:
h d l --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-6-589026671881> in <module>() 7 print(msg[2]) 8 #獲取第12個元素 ----> 9 print(msg[11]) IndexError: string index out of range
誒呀我去,怎麼出了這麼個玩意?一般大家看到這種錯誤,莫名的頭疼,這時候我們會問:
4.訪問第一個元素索引為什麼是0?
序列的索引從0開始,所以我們訪問第一個元素對應索引為0,那麼我們訪問第二個索引就是2-1,訪問第N個元素,索引就是N-1; 換個說法,如果訪問第0個元素,索引就是0了;
5.為什麼會出錯,這是什麼情況?
訪問索引超過了序列長度就會報錯,因為訪問的元素不存在。
6.怎麼看這個錯誤?
Python中出錯後,會將出錯行,出錯信息提示出來,給了我們足夠信息去解決問題,具體意思如下:

下次看到這種錯誤就查下序列長度與索引值。
7.我想遍歷整個序列,難道要msg[1],msg[2]…msg[n]么?
如果你想,這種方式也是可以的; 但是我們一般使用for循環,代碼如下:
print(msg) #for 遍歷序列,依次去msg中的每個元素, #並賦值給val for val in msg: print(val)
8.for循環為什麼不會出錯?
for 循環內部做了異常處理,所以不會出錯,我們直接使用就可以。
9.切片操作是怎麼回事?
切片是Python中的操作符,類似函數操作,使用方式如下:
sequence[start:stop]:start為起始索引,stop為結束索引, 結果為:獲取索引start到stop-1元素,返回新的序列; start默認為0,stop默認到最後; sequence[start:stop:step]:與上類似,step為步進值,默認為1;
10.如何使用切片操作?
舉個例子,msg = 'hellowolrd',jupyter下操作如下:
msg = 'helloworld' #索引從0開始算 #獲取索引2到4之間元素? print(msg[2:5]) #stop -1 #獲取索引0到7之間元素? print(msg[0:8]) #獲取索引5之後所有元素? print(msg[5:11]) #stop -1 print(msg[5:]) #默認到最後 print(msg[5:100])#會不會報錯,為什麼?
輸出結果:
llo hellowor world world world
11.切片操作有高級使用方式么?
沒有高不高級,看如何使用; 同樣一塊面,你做成饅頭他就2元,你做成蛋糕他就有一萬種可能。
理解知識點:序列有兩種索引:正索引,負索引; 切片操作三個值:start,stop,step,step為步進值,可以為-1;
先提出問題,然後自己嘗試去實現,可以把答案寫在品論區,再繼續閱讀:
1>索引倒數第3個之後所有元素, 2>索引從0到結束,隔一個取一個, 3>索引倒數第二個開始,向前隔一個取一個元素, 4>切片操作實現倒序,
到這裡,應該在自己環境下嘗試練習了,我這邊繼續,具體實現如下:
msg = 'helloworld' #獲取索引倒數第二個元素之後所有元素 print(msg[-2:]) #獲取索引從0到結束,隔一個取一個元素 #理解為,start為0,stop到最後,step為2的切片操作 print(msg[::2]) #倒數第二個開始,向前隔一個取一個元素 #理解為:start為-2,stop到最前,step為-2的切片操作 print(msg[-2::-2]) #切片操作實現倒序? print(msg[::-1])
輸出結果:
ld hlool loolh dlrowolleh
這些搞定了,我們就基本掌握切片操作了。
12.序列支持運算符嗎?
運算符 |
是否支持 |
---|---|
算數運算符 |
支持加法與乘法操作,返回新的序列 |
比較運算符 |
支持,返回True與False |
邏輯運算符 |
支持 |
注意:必須是同種類型數據結構操作才有意義。
13.我想要拼接字符串,如何操作?
直接使用加法操作,如下:
wd1 = 'hello' wd2 = 'world' print(wd1 + wd2) print(wd1 * 2)
輸出結果:
helloworld hellohello
14.取序列長度?
使用len方法:
msg = 'helloworld' print(len(msg))
輸出結果:10
15.能否通過索引遍歷序列?
能,使用range方法,生成索引,然後使用for循環遍歷:
msg = 'helloworld' #獲取長度,生成range對象 #使用for遍歷range獲取索引 #通過索引訪問元素 for index in range(len(msg)): print(msg[index])
16.能否再遍歷的時候獲取索引與元素?
需要使用enumerate:enumerate(iterable[, start]) 參數:iterable:可迭代對象,start:可選參數,指定起始位置; 返回:索引與value對應的enumerate對象; 可以使用for循環進行遍歷,具體使用如下:
msg = 'helloworld' #創建enumerate對象 items = enumerate(msg) #遍歷enumerate對象 for item in items: print(item)
輸出結果:
(0, 'h') (1, 'e') (2, 'l') (3, 'l') (4, 'o') (5, 'w') (6, 'o') (7, 'r') (8, 'l') (9, 'd')
17.還沒真正獲取索引,這個索引和元素在一起如何處理?
是否還記得多元賦值:x,y = 1,2 第一種方式:
msg = 'helloworld' for item in enumerate(msg): index, value = item print(index, value)
第二種方式:
msg = 'helloworld' for tindex, tvalue in enumerate(msg): print(tindex, tvalue)
第一種容易理解,第二種怎麼回事? for循環迭代的時候,首先從 enumerate取元素,而 enumerate的每個元素都是(index, values),我們這裡加了兩個變量tindex, tvalue去接受值,相當於多元賦值。
18.判斷元素是否存再序列中存在?
使用操作符:in與not in in:元素是否在序列中,在返回True,否則返回False,例如:'a' in 'abc'; not in:與in相反;
實際操作如下:
#加法與乘法: msg = 'helloworld*' #元素是否在序列中 print('w in msg:', 'w' in msg) print('a in msg:', 'a' in msg) print('a not in msg:','a' not in msg)
輸出結果:
w in msg: True a in msg: False a not in msg: True
好了,到這裡我們對序列基本知識點就有了一定認識。 更多精彩內容可以關注老貓的專欄: 《20天搞定Python編程》 鏈接地址:https://blog.51cto.com/cloumn/detail/34 。