十八問,認識Python序列

序列是Python中的重要數據結構,序列包括字符串,列表,元組。
大部分讀者朋友學習Python的時候都會找本書或者資料從頭看到尾,這次我們換一個思路,問答式的方式,可能讓我們精力更集中,下面開始我們的提問:

1.什麼是序列?

序列是將元素按照順序排列,通過索引(下標)訪問;
字符串、列表、元組都屬於序列。

2.能直觀描述下嗎?

直接上圖:
十八問,認識Python序列
序列中的每個元素按順序排列,使用索引進行訪問,索引分爲正負索引;

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中出錯後,會將出錯行,出錯信息提示出來,給了我們足夠信息去解決問題,具體意思如下:
十八問,認識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)

輸出結果:

wd1 = 'hello'
wd2 = 'world'
print(wd1 + wd2)
print(wd1 * 2)

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編程》
鏈接地址:http://blog.51cto.com/cloumn/detail/34

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章