十八問,認識Python序列

序列是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