索引和切片
索引(下標)
索引又稱下標,用來表示可迭代對象中的某個元素的位置。
- 用正整數表示的索引值,從左向右定位,從 0 開始計數,如 0,1,2
- 用負整數表示的索引值,從右向左定位,從 -1 開始計數,如 -1,-2,-3
例如:
name = "meet" # 計算機從0開始數
#0123 (索引值|下標值) 從左向右
#-4-3-2-1 從右向左
print(name[2]) # 通過索引准確定位內容
print(name[-4]) # 通過索引准確定位內容
輸出的結果為:
e
m
切片
有這樣一個字符串:meet_alex_wusir
,我們想要把其中的 alex
取出來,該怎么做呢?一個可行的方法是,分別用 a
、l
、e
和 x
的索引值,把它們分別取出來,再利用字符串的 加和
操作把它們拼接起來,就像這樣:
name = "meet_alex_wusir"
a = name[5] # 取出a
b = name[6] # 取出l
c = name[7] # 取出e
d = name[8] # 取出x
print(a + b + c + d) # 拼接並打印字符串
當然也可以通過循環的方法來取出相應的字符,然后拼接成新的字符串:
name = "meet_alex_wusir"
i = 5
s = ''
while i <= 8:
s += name[i]
i += 1
print(s)
因為這樣的循環在 Python 中非常常用,所以被封裝成為了一種簡便的方法,就是字符串的 切片
。切片的基本格式和使用方法如下:
name = "meet_alex_wusir"
# 0123456789
print(name[5:9]) # [起始位置:終止位置] 顧頭不顧腚(起始位置保留,終止位置不保留)
print(name[-5:]) # [起始位置:終止位置(默認到結尾)] 顧頭不顧腚
print(name[:]) # [起始位置(默認從開頭):終止位置(默認到結尾)] 顧頭不顧腚
輸出的結果為:
alex
wusir
meet_alex_wusir
關於切片的終止位置的選擇,還有一個技巧是:終止位置 = 起始位置 + 切片長度
。例如上面的例子中,起始位置為 5
,切片長度為 4
,終止位置為 5 + 4 = 9
。
有的時候我們並不想要一個一個取字符,而是要隔一個字符取一個。比如對於上面 "meet_alex_wusir"
的例子,我們想要取第 3
、5
、7
位的 e
、_
、l
,該如何操作呢?
我們依舊可以使用最原始的,分別取值,然后拼接字符串的方法:
name = "meet_alex_wusir"
a = name[2]
b = name[4]
c = name[6]
print(a + b + c)
這種方法確實能得到我們想要的結果,但是太過繁瑣。如果我們想要處理很長的字符串,就會非常麻煩了。這就需要我們在切片時引入 步長
變量。步長
是使用切片方法的第三個參數,默認值為 1
。對於上面的例子,我們可以設置 步長
為 2
:
name = "meet_alex_wusir"
#0123456789
#-6-5-4-3-2-1
print(name[2:7:2]) #[起始位置:終止位置:步長(默認為1)]
如果我們把步長設置成 -1,可以實現從右向左查找:
name = "meet_alex_wusir"
print(name[-1:3:-1]) # 步長可以控制查找方向
輸出的結果為:
risuw_xela_
在進行索引操作時,如果輸入的參數超過最大索引值時,程序會報錯。而在進行切片操作時,如果終止位置超出最大索引值時,程序不會報錯,而是會走到字符串的結尾:
name = "meet_alex_wusir"
print(name[2:20:2])
輸出的結果為:
e_lxwsr
需要注意的是,索引和切片只能給有序數據(字符串、列表、元組)使用。整型和布爾值等均不可以用來進行索引和切片操作。
同整型一樣,字符串也是一個不可變的數據類型:
name = "meet"
print(id(name)) # 2388909933712
name = name + "最帥了"
print(id(name)) # 2388910157296
在 Python 中,對於字符串的賦值,還會有這樣一個有趣的情況:
name = "meet"
name1 = "meet"
print(id(name)) # 2313349022864
print(id(name1)) # 2313349022864
明明是兩次賦值,兩個字符串的內存地址居然是相同的。這是因為 Python 中有一個小數據池,小數據會駐留。在小數據駐留期間對相同的數據有新的賦值操作,不會新開辟一個內存空間,而是將變量指向已有數據的內存地址。小數據池機制是為了節省內存空間。