什麼是切片?
不管是字串、還是List,在Python裡只要是符合"序列"概念的物件,都可以使用"切片"(slice)的方式去存取,至於為什麼叫切片呢? 想像一下字串是一條香腸,你要取其中的一段,就像在切片一樣,你要從頭到尾,還是從頭到中間,又或著中間取一段呢? 這就是所謂的切片的概念,以下讓我們介紹字串切片的使用方法:
語法 | 說明 |
---|---|
s[i] | 取第i個字元的字串,從0當做第一個開始算 |
s[i:j] | 取從第i個開始,到j的前一個,也就是不包含j |
s[i:j:k] | 取從第i個開始,到j的前一個,也就是不包含j,但是每k步個才取一個字 |
接下來我們看第二個,通常也是最常用的方式,例如字串是s = 'abcd'
- s[0:2]
的結果就是'ab'
- s[1:2]
就是'b',和
- s[1]
的效果一樣,而
- s[2:4]
也就是'cd',除了這樣的規則之外,如果起始為0的話,可以省略0不寫,換言之,省略不寫第一個,就會被當成從0開始,例如
- s[0:2]
可以省略成
- s[:2]
前面的數字被省略了,Python就知道前面是0,而終止的數字如果是字串的長度,也一樣可以省略不寫,換言之終止的數字省略不寫就會被設為字串的長度,例如
- s[2:4]
可以省略為
- s[2:]
除了這些,還有和上面一樣的負數規則,就是負數代表是從右邊數過來的第幾個,例如
- s[:-1]
結果是'abc',而
- s[-2:-1]
就是'c',效果和
- s[-2]
是一樣的。
最後是第三種形式,規則都和上面一樣,只是加了k步取一個字的規則,例如s = 'abcd'
- s[::1]
的結果是'abcd',因為是從頭到尾的切片,而且隔一步取一個,所以有和沒有是一樣的,但是
- s[::2]
就不一樣了,兩步才取一個字,所以是'ac',而比較複雜的是,步數也有負數的規則,如果步數是負的,表是從i到j以負數前進,例如
- s[::-1]
結果會是dcba,除此之外,對於負的步數而言,起始省略會變成字串的最後一個字元開始,而終止省略的話,會變成字串的第一個字元,因此
- s[::-1]
可以寫成
- s[3::-1]
這樣呢?
- s[3:0:-1]
因為終止條件不包括在被取到的字在內,只有省略才能表示,如果寫成這樣會變成'dcb',因為不包括0,但是比0前面的字元如果用負數表示卻又變成了從後 面數過來,因此只能用省略來表示負步數的第一個字元之前當結尾,這個部份有點難懂,但是知道s[::-1]可以將字串反過來就好,因為這個部份比較少用 到。
字串abcd用表格表示:
正數索引 | 0 | 1 | 2 | 3 |
負數索引 | -4 | -3 | -2 | -1 |
字串內容 | a | b | c | d |
s[0:4] 結果是 abcd | 取0 | 取1 | 取2 | 取3,不包括4,到3就終止 |
s[:2] 結果是 ab | 取0 | 取1,不包括2,到1就終止 | ||
s[-2:-1] 結果是 c | -2開始,取-2,不包括-1,所以到-2就終止 | |||
s[::2] 結果是 ac | 取0 | 2步取1字,此步不取 | 取2 | 2步取1字,此步不取,不包括4,到3就終止 |
s[::-1] 結果是dcba | 取0,不包括0前面一個,到0終止 | 取1 | 取2 | 負步數省略由-1開始 |
接下來我們示範字串切片的使用:
- # -*- coding: utf-8 -*-
- string = u"中文字測試"
- # 印出前三個字
- print string[:3]
- # 印出中間三個字
- print string[1:4]
- # 印出最後一個字
- print string[-1]
- # 跳一個字印
- print string[::2]
- # 倒過來印
- print string[::-1]
可改變的序列使用切片
什麼是可改變,什麼是不可改變,在這裡我們還不打算說明,將在後面的章節解釋,在這裡請先記得,字串是不可改變的序列,而List是可改變的序列,以上的方法都可以應用在可改變和不可改變的序列,換言之,你也可以應用上面的方法在List,而不只有在字串上,以下我們介紹針對可改變的序列的切片操作。
語法 | 說明 |
---|---|
s[i] = x | 取代s中第i個元素為x |
s[i:j] = t | 取代s的切片內容為t序列的內容 |
del s[i:j] | 從s中刪除切片所含的元素 |
s[i:j:k] = t | 取代s的切片內容成為t序列的內容(t序列的長度必須和切片長度一樣) |
del s[i:j:k] | 從s中刪除切片中所含的元素 |