一、角標序號的概念
無論是字符串、列表還是元組,都被稱作【序列】,只要是序列就可以切片。而搞清楚序列的序號的定位方法,是一個基本功。
在Python裏,序號有兩種表達方式,一個是正向角標序號,一個是反向倒數序號。
我定義的這兩個名字,會更利於中文語言環境的同學的理解和學習。
1)正向角標序號
一圖勝萬言:
有一個字符串序列”abcdef”,它的每一個字符的角標關係就是上圖所示。其實這個方法也叫【插空法】。想象序列中每一項之間都有一個空隙,我們就是把0,1,2,3,4,5……這個數數序列插到空隙中。對於每一項來說,它的左下角的角標就是自己的定位,大家都是對號入座的。
建立一個有效的模型,通過這樣一個明確的方法,至少我個人在平時列表序號時可以一步到位,不會數錯。
2)反向倒數序號
在做切片時,有時還會用到倒序號,其實很好辦,比如字母d就是倒數第3個,很符合中文的語言習慣,python的序號就是-3.
那麼他是什麼原理呢?你可以試着把上面的圖寫在一個紙條上,把它首尾相接,這個時候,f的右下角標和a的左下角標重合,都是0,像不像一個數軸?在數軸上,0的右側起,是1,2,3,4,……,0的左側起,自然就是-1,-2,-3,……了,很自然是不是?
再換一個角度,從負數開始插空,是不是還是左下角角標規則?神奇吧?~
這就是python的神奇之處,他很符合我們的數學邏輯,而且是一個統一、自洽的嚴謹邏輯。
二、切片語法
記住一句話:。總共分成三類,0個冒號、1個冒號和2個冒號。
1)0個冒號
L = 'abcdef'
print(L[2])
2)1個冒號
print(L[2:4])
print(L[2:-1])
print(L[-1:-4])
print(L[-4:-1])
print(L[:-4])
print(L[-4:])
當序號是0時,冒號語法允許不寫0。最後兩個公式裏,其實是[0:-4]和[-4:0]。可以發現,只有位置是0時,可以左右顛倒,因爲0既可以表示第1位的序號數(在冒號左側時),也可以表示最後一位(在冒號右側時,因爲左閉右開),正因爲如此特殊,0纔可以省略不寫。
這其實又呼應了上一章節的反向倒數序號,f的右下側角標其實是0,再次驗證這種抽象模型的合理性。再好好看看這個模型,記住它。
2)2個冒號
如果你觀察得很仔細,前面的藍色註釋裏括號內的部分,正是每次省略冒號的默認值。
print(L[0:4:2])
第二個冒號後的數字是步長,它決定了前面所得到的子串 是從第一個開始第n個作爲下一個。
默認是1,就意味着,0:4首先取到前4個字符abcd,然後每+1個序號,取一個,直到都取完,那默認就是abcd,沒有變化。
如果是題目中的步長爲2,那麼就是取得到的abcd的第0位,第0+2位,第0+2+2位(此位不存在,不再往後累加2),那麼得到的是ac,你懂了。