python slice

什麼是切片?

不管是字串、還是List,在Python裡只要是符合"序列"概念的物件,都可以使用"切片"(slice)的方式去存取,至於為什麼叫切片呢? 想像一下字串是一條香腸,你要取其中的一段,就像在切片一樣,你要從頭到尾,還是從頭到中間,又或著中間取一段呢? 這就是所謂的切片的概念,以下讓我們介紹字串切片的使用方法:

語法說明
s[i] 取第i個字元的字串,從0當做第一個開始算
s[i:j] 取從第i個開始,到j的前一個,也就是不包含j
s[i:j:k] 取從第i個開始,到j的前一個,也就是不包含j,但是每k步個才取一個字
我們先從最簡單的介紹起,就是第一個,取其中一個字, Python和其它大部份語言一樣,索引是從0開始算的,所以這語法也就是取從0開始的第i+1個字,但是請注意的一點是,如果你學過其它程式語言,可能知道什麼是字元,  在Python裡沒有所謂的字元,只有長度為1的字串,所以回傳的也是長度為1的字串,而不是字元,除此之外,如果索引是負數的話,代表從右邊數過來的第幾個,例如s = 'abcd',s[-1]就是'd'。

接下來我們看第二個,通常也是最常用的方式,例如字串是s = 'abcd'

  1. s[0:2]  

的結果就是'ab'

  1. s[1:2]  

就是'b',和

  1. s[1]  

的效果一樣,而

  1. s[2:4]  

也就是'cd',除了這樣的規則之外,如果起始為0的話,可以省略0不寫,換言之,省略不寫第一個,就會被當成從0開始,例如

  1. s[0:2]  

可以省略成

  1. s[:2]  

前面的數字被省略了,Python就知道前面是0,而終止的數字如果是字串的長度,也一樣可以省略不寫,換言之終止的數字省略不寫就會被設為字串的長度,例如

  1. s[2:4]  

可以省略為

  1. s[2:]  

除了這些,還有和上面一樣的負數規則,就是負數代表是從右邊數過來的第幾個,例如

  1. s[:-1]  

結果是'abc',而

  1. s[-2:-1]  

 就是'c',效果和

  1. s[-2]  

是一樣的。

最後是第三種形式,規則都和上面一樣,只是加了k步取一個字的規則,例如s = 'abcd'

  1. s[::1]  

的結果是'abcd',因為是從頭到尾的切片,而且隔一步取一個,所以有和沒有是一樣的,但是

  1. s[::2]  

就不一樣了,兩步才取一個字,所以是'ac',而比較複雜的是,步數也有負數的規則,如果步數是負的,表是從i到j以負數前進,例如

  1. s[::-1]  

結果會是dcba,除此之外,對於負的步數而言,起始省略會變成字串的最後一個字元開始,而終止省略的話,會變成字串的第一個字元,因此

  1. s[::-1]  

可以寫成

  1. s[3::-1]  
為什麼不寫

這樣呢?

  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開始

接下來我們示範字串切片的使用:

  1. # -*- coding: utf-8 -*-  
  2.   
  3. string = u"中文字測試"  
  4.   
  5. # 印出前三個字  
  6. print string[:3]  
  7.   
  8. # 印出中間三個字  
  9. print string[1:4]  
  10.   
  11. # 印出最後一個字  
  12. print string[-1]  
  13.   
  14. # 跳一個字印  
  15. print string[::2]  
  16.   
  17. # 倒過來印  
  18. 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中刪除切片中所含的元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值