本文來自異想之旅公開發布的Python教程,原文地址:https://www.yuque.com/yxzl/python
本文以列表舉例,字符串與之類似,將在最後簡單對比。
我們經過 1.6 章節的學習已經知道,我們定義一個列表 a = [1, 2, 3]
,可以通過 a[0]
a[1]
a[2]
的方式取出其中的每一項。
這就是最簡單的索引,現在在這個的基礎上,我們再介紹一個負數索引。
我們定義這樣的一個列表,並嘗試打印它的每一項:
t = ['a', 'b', 'c', 'd', 'e']
print(t[0], t[1], t[2], t[3], t[4]) # a b c d e
print(t[-1], t[-2], t[-3], t[-4], t[-5]) # e d c b a
可以看到, 0,1,2...
分別取出了列表從前往後數的第 1,2,3...
項,而 -1,-2,-3...
分別取出了列表從後往前數的第 1,2,3...
項。
為什麼第1
項索引為0
?因為編程語言從0
開始計數。為什麼倒數第一項索引為-1
而不是-0
?因為-0
和0
相同,將導致沖突。
下面再用這張比較直觀的圖片幫助大家記憶索引。
我們先看如下的示例:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[0:3]) # 第一項:第四項
print(a[3:6]) # 第四項:第七項
print(a[2:7]) # 第三項:第八項
為了在前期幫助大家排除索引從 0 開始計數的干擾,我用注釋標出來了每個索引對應在列表中是第幾項。轉換完後,第幾項就是數字幾,不暈了吧~
輸出內容如下:
[1, 2, 3]
[4, 5, 6]
[3, 4, 5, 6, 7]
我們分析一下結果(不要搞錯索引和第 x 項):
0:3
時,輸出的是原列表索引為 0
到 2
的片段3:6
時,輸出的是原列表索引為 4
到 6
的片段2:7
時,輸出的是原列表索引為 2
到 6
的片段a:b
時,輸出的是原列表索引為 a
到 b - 1
的片段為什麼是 b - 1
呢?這就要提到編程中的第二個重要法則(上一個是從零開始計數):左閉右開。即我們傳入 a:b
時,實際上取到的區間為 [ a , b ) [a,b) [a,b) 這樣的左閉右開區間。實在不理解的話,就請先記住吧。
如果在 a:b
中我們缺失了一個參數,Python 會默認截取到字符串的開頭或結尾:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[:3]) # 到索引為3-1=2的位置結束,輸出:[1, 2, 3]
print(a[6:]) # 從索引為6的位置開始,輸出:[7, 8, 9]
自然,我們也可以使用負數索引:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[-6:-4]) # 輸出:[4, 5]
print(a[-3:]) # 輸出:[7, 8, 9]
老規矩,先看程序:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[0:5:2]) # 輸出:[1, 3, 5]
print(a[2:8:3]) # 輸出:[3, 6]
當我們傳入兩個參數 a:b
時,取到的列表大概長這樣:[(a), (a + 1), (a + 2), ..., (b - 2), (b - 1)]
((x)
表示列表索引為 x
的元素,下同)
如果傳入 a:b:c
三個參數, a
與 b
控制開始和結束位置的功能不變,而 c
定義的是每取完一個元素後增加的步長。如當我們傳入 0:5:2
時,取到的列表為 [(0), (2), (4)]
;當我們傳入 2:8:3
時,取到的列表為 [(2), (5)]
當然,第三個參數 c
也可以是負數,具體實現如下:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[5:0:-2]) # 輸出:[6, 4, 2]
print(a[::-2]) # 輸出:[9, 7, 5, 3, 1]
print(a[::-1]) # 輸出:[9, 8, 7, 6, 5, 4, 3, 2, 1]
你會發現,一維我們叫做索引,而二維、三維我們叫做切片,這是為什麼?因為在只傳遞一個數字時,我們獲取到的是一個元素;而在傳遞兩個及以上的數字時,我們獲取到的是原本的列表的一段子列表,哪怕這個列表的長度為一甚至是零。
與列表大同小異
a = 'HelloWorld'
print(a[0:5]) # Hello
print(a[6:8]) # or
print(a[0:8:2]) # Hloo
print(a[::-1]) # dlroWolleH