2017-05-03

無極限的 Python Slice 語法

Python Slice 就像是刀子,可以「任意切出」想要的部份,這把刀可以用在字串、list 與 tuple 這類「有序」的集合。

有序的集合

簡單舉例就是排隊,可以用第一位、第二位、、、一路指出每一個 item 的 index。
str = 'SLICE'
print(str[0]) # S
print(str[1]) # L
print(str[2]) # I

li = ['S', 'L', 'I', 'C', 'E']
print(li[0]) # S
print(li[1]) # L
print(li[2]) # I

Slice 語法

[start : stop : step]
以中括號組成,最多可以放入三個參數,每個參數都是 optional。
  • start:起始 index,預設為 0,包含
  • stop:結束 index,預設為總長度,不包含
  • step:進位,預設為 1
step 看似很陌生的概念,其實已經用到爛了,就是以下 Java 迴圈裡的 2,一次進 2 位的意思。

for (int i=0; i<10; i+=2) {
    // i
}

Slice 實務

直接看 code 最有感覺了。
str = 'Python'
print(str) # Python

li = list(str)
print(li) # ['P', 'y', 't', 'h', 'o', 'n']

# zero-based
print(str[0]) # P
print(li[0]) # P,是 str,不是 list 喔

# 透過起迄取得子字串,包括起,不包括迄
print(str[0:4]) # Pyth
print(li[0:4]) # ['P', 'y', 't', 'h']

# 起預設為 0,可用來取「前 n 碼」
print(str[:4]) # Pyth
print(li[:4]) # ['P', 'y', 't', 'h']

# 迄預設為總長度
print(str[4:]) # on
print(li[4:]) # ['o', 'n']

# 起迄都用預設值,就是指全部
print(str[:]) # Python
print(li[:]) # ['P', 'y', 't', 'h', 'o', 'n']

# 迄小於等於起,得空字串或 list
print(str[2:2]) # 
print(str[5:2]) # 
print(li[2:2]) # []
print(li[5:2]) # []

# 可以使用負整數,-1 表示最後一個 item,可用來取「後 n 碼」
print(str[-1]) # n
print(li[-1]) # n,是 str,不是 list 喔

# 起可以低於 0,但不會回折,而是改用 0
print(str[-10:4]) # Pyth
print(li[-10:4]) # ['P', 'y', 't', 'h']

# 迄可以超過總長度,但不會回折,而是改用總長度
print(str[0:10]) # Python
print(li[0:10]) # ['P', 'y', 't', 'h', 'o', 'n']

# 還有神奇的第三個參數,表示一次跳幾位,預設為 1 位
# 可用來取奇數或偶數 item
print(str[::2]) # Pto
print(li[::2]) # ['P', 't', 'o']
print(str[1::2]) # yhn
print(li[1::2]) # ['y', 'h', 'n']

# 神奇的第三個參數遇到負數,已瘋,表示反向
print(str[::-1]) # nohtyP
print(li[::-1]) # ['n', 'o', 'h', 't', 'y', 'P']
# 已經無法思考了!!!
print(str[::-2]) # nhy
print(li[::-2]) # ['n', 'h', 'y']
---
---
---

沒有留言:

張貼留言