知乎問(wèn)答之 Python 切片
這是一個(gè)知乎問(wèn)答的補(bǔ)充。原問(wèn)題是python中字符串 s[ : -1]是什么意思气破?,當(dāng)時(shí)回答的內(nèi)容只是對(duì)問(wèn)題本身的簡(jiǎn)單回答,對(duì) Python 切片中的重要信息是有所忽略的贡耽。如果以slice
對(duì)象的方式進(jìn)行切片的話,其語(yǔ)法是這樣的:slice(start, stop[, step])
,在原回答中把重要的step
給忽略掉了蒲赂,當(dāng)然阱冶,題主也沒(méi)有問(wèn)到。但仍然很有必要把 Python 切片中的重要信息給補(bǔ)充上滥嘴。所以木蹬,在這里重新整理一下 Python 切片相關(guān)知識(shí),主要參考 Python 官方文檔若皱、博客文章镊叁、以及 Python 書(shū)籍《Python 編程快速上手 讓繁瑣工作自動(dòng)化》和《Python 編程無(wú)師自通 專(zhuān)業(yè)程序員的養(yǎng)成》。
切片
切片是:將一個(gè)可迭代對(duì)象中元素的子集走触,創(chuàng)建為一個(gè)新的可迭代對(duì)象晦譬。可迭代對(duì)象包括所有序列類(lèi)型互广,如基本序列類(lèi)型:list
, tuple
和 range
對(duì)象敛腌,以及特別定制的附加序列類(lèi)型,str
和 bytes
惫皱。利用 Python 的切片功能可實(shí)現(xiàn)對(duì)序列的提取像樊、倒序、淺復(fù)制和修改逸吵、刪除元素的操作凶硅。
切片的實(shí)現(xiàn)方法
要實(shí)現(xiàn)切片有兩種方法,一是索引擴(kuò)展(Extending Indexing)的方式扫皱;二是slice
對(duì)象的方式足绅。語(yǔ)法如下所示:
索引擴(kuò)展(Extending Indexing)
sequence [start:stop[:step]]
start
Optional. Starting index of the slice. Defaults to 0.
stop
Optional. The last index of the slice or the number of items to get. Defaults to len(sequence).
step
Optional. Extended slice syntax. Step value of the slice. Defaults to 1.
slice
對(duì)象,其實(shí)方括號(hào)(下標(biāo)/索引)標(biāo)記在內(nèi)部使用的就是 slice
對(duì)象韩脑。
sequence [slice(start, stop[, step])]
序列元素訪問(wèn)復(fù)習(xí)——索引
在開(kāi)始切片之前氢妈,讓我們先復(fù)習(xí)一下序列元素的訪問(wèn)。切片的其中一種方法是索引擴(kuò)展(Extending Indexing)段多,那么要訪問(wèn)序列的元素可以用索引首量,其實(shí)切片也是訪問(wèn)元素的一種,區(qū)別在于切片是返回序列进苍,而索引是返回單個(gè)元素加缘。
序列索引只能是整數(shù),不能是浮點(diǎn)值觉啊。不然將導(dǎo)致 TypeError
錯(cuò)誤拣宏。序列訪問(wèn)支持負(fù)數(shù)索引,即:可用來(lái)從右向左查找杠人,可迭代對(duì)象中元素的索引(必須是一個(gè)負(fù)數(shù))勋乾。整數(shù)值 ?1 指的是 列表中的最后一個(gè)索引宋下,?2 指的是列表中倒數(shù)第二個(gè)索引,以此類(lèi)推辑莫,在這里重點(diǎn)注意学歧,負(fù)數(shù)索引是向后查找,從右往左的各吨,切片同樣支持負(fù)數(shù)枝笨。如下圖:
正式開(kāi)始切片
切片時(shí)包含起始索引位置的元素绅你,但不包括結(jié)束索引位置的元素伺帘,即[start,stop)
昭躺。當(dāng)start + 1 == stop
時(shí)返回一個(gè)元素忌锯;當(dāng)start == stop
時(shí)返回一個(gè)空(empty
)序列。
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[1:5] # ['b', 'c', 'd', 'e']
l[1:2] # ['b']
l[4:4] # []
作為快捷方法领炫,你可以省略切片中冒號(hào)兩邊的一個(gè)索引或兩個(gè)索引偶垮。省略第一個(gè)索引相當(dāng)于使用 0,或列表的開(kāi)始帝洪。省略第二個(gè)索引相當(dāng)于使用列表的長(zhǎng)度似舵,意味著切片直至列表的末尾。當(dāng)兩個(gè)都省略時(shí)葱峡,即返回一個(gè)原索引的淺復(fù)制(shallow copy)砚哗。
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[:3] # ['a', 'b', 'c']
l[0:3] # ['a', 'b', 'c']
l[4:] # ['e', 'f', 'g', 'h', 'i']
l[4:len(l)] # ['e', 'f', 'g', 'h', 'i']
l1 = l[:] # 淺復(fù)制
l is l1 # False
切片中的負(fù)數(shù)索引,同樣從右往左向后查找砰奕。
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[-7:-2] # ['c', 'd', 'e', 'f', 'g']
l[2:7] # ['c', 'd', 'e', 'f', 'g']
l[2:-5] # ['c', 'd']
l[-8:] # ['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[:-1] # ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
到現(xiàn)在為止,還沒(méi)有為切片設(shè)定step
值军援,其實(shí)是在使用默認(rèn)值仅淑,默認(rèn)值為1
,即每次移動(dòng)一個(gè)序列元素胸哥。如果想要跳過(guò)一些元素涯竟,就可以顯式設(shè)定step
的值。
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[2:7:2] # ['c', 'e', 'g']
同樣的空厌,step
也支持負(fù)數(shù)庐船,也是向后采集的意思。如果setp
為負(fù)數(shù)嘲更,start
值必須大于stop
筐钟,不然將會(huì)得到一個(gè)空(empty
)序列;如果省略start
值哮内,相當(dāng)于從原序列的末尾開(kāi)始盗棵,如果省略stop
值壮韭,相當(dāng)于從原序列的開(kāi)始結(jié)束;而如果start
值和stop
值都省略纹因,并把step
值設(shè)置為1
的話喷屋,將會(huì)得到一個(gè)反轉(zhuǎn)的(reversed
)序列。
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[6:1:-2] # ['g', 'e', 'c']
l[1:6:-2] # []
l[:6:-1] # ['i', 'h']
l[6::-1] # ['g', 'f', 'e', 'd', 'c', 'b', 'a']
l[::-1] # ['i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
切片除了可以查找序列中的元素之外瞭恰,還有一些重要的功能就是修改序列/元素屯曹、刪除序列元素。
# 修改
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[1:4] = [1, 2, 3] # 修改后結(jié)果為:['a', 1, 2, 3, 'e', 'f', 'g', 'h', 'i']
l[1:2] = [1, 2, 3] # 修改/替換后的結(jié)果為:['a', 1, 2, 3, 2, 3, 'e', 'f', 'g', 'h', 'i']
# 插入
l = ['a', 'b', 'c']
l[:0] = [1, 2, 3] # 插入后結(jié)果為:[1, 2, 3, 'a', 'b', 'c']
l = ['a', 'b', 'c']
l[len(l):] = [1, 2, 3] # 插入后結(jié)果為:['a', 'b', 'c', 1, 2, 3]
l = ['a', 'b', 'c']
l[1:1] = [1, 2, 3] # 插入后結(jié)果為:['a', 1, 2, 3, 'b', 'c']
# 刪除
l = ['a', 'b', 'c', 'd', 'e']
l[1:5] = [] # 刪除后結(jié)果為:['a']
# 還可以用 del 語(yǔ)句刪除序列中的部分元素
l = ['a', 'b', 'c', 'd', 'e']
del l[1:5] # 刪除后結(jié)果為:['a']惊畏,效果一樣
以上都是索引擴(kuò)展(Extending Indexing)的方法實(shí)現(xiàn)切片恶耽,現(xiàn)在再來(lái)看看slice
對(duì)象。同樣的颜启,可以為其指定start
值和stop
值偷俭,缰盏。要注意的是step
是一個(gè)可選參數(shù),默認(rèn)是1
slice
對(duì)象可以只給一個(gè)參數(shù)涌萤,這時(shí)就相當(dāng)于[:stop]
,如果把這個(gè)參數(shù)設(shè)為None
就相當(dāng)于[:]
口猜。
l = ['a', 'b', 'c', 'd', 'e']
s = slice(1, 5, 2) # slice(1, 5, 2)
s = slice(1, 5) # slice(1, 5, None)
s = slice(5) # slice(None, 5, None)
s = slice(None) # slice(None, 5, None)
s = slice(None) # slice(None, None, None)
關(guān)于 Python 切片基本就整理到此负溪,初學(xué)者使用切片可能容易出錯(cuò)。需要記住的是济炎,負(fù)數(shù)從右向左查找川抡;切片時(shí)包含起始索引位置的元素,但不包括結(jié)束索引位置的元素须尚,即[start,stop)
崖堤;當(dāng)你的stop
不是預(yù)期時(shí),可以設(shè)置為stop + 1
或省略恨闪,尤其是step
為負(fù)數(shù)的情況下倘感;切片中的 index
不會(huì)發(fā)生list index out of range
的錯(cuò)誤。以上可能有錯(cuò)漏的地方咙咽,歡迎指正老玛。作為非大神,菜鳥(niǎo)一只的我钧敞,拍磚也懇請(qǐng)輕拍蜡豹。
這次的 Python 切片整理是源于一個(gè)知乎問(wèn)答,python中字符串 s[ : -1]是什么意思溉苛?镜廉,當(dāng)時(shí)主要是摘錄了兩本書(shū)的相關(guān)章節(jié)內(nèi)容,后面再慢慢搜索整理愚战、補(bǔ)充娇唯。其實(shí)讀書(shū)無(wú)論是對(duì)于新手還是老司機(jī)都是學(xué)習(xí)的好方法齐遵,這不,前段時(shí)間從阮一峰先生博客看到一個(gè)資源鏈接塔插,于是也把里面的書(shū)單給整理出來(lái)了梗摇,可能是因?yàn)槎际呛脮?shū)吧,基本上都能找到對(duì)應(yīng)的中文版本想许。這其中還有兩本免費(fèi)的英文原版書(shū)伶授,《Python Programming: An Introduction to Computer Science 》和《Learning With Python: How to Think Like a Computer Scientist》。有興趣的可以稍作移步了解一下流纹,就在知乎專(zhuān)欄文章上:自學(xué) Python 可以選擇哪些入門(mén)書(shū)籍糜烹,這當(dāng)然也是源于一個(gè)知乎問(wèn)答的整理自學(xué)Python可以選擇哪些入門(mén)書(shū)籍?漱凝。
Note:這是知乎問(wèn)答的一篇恰飯稿疮蹦,略有改動(dòng)。原恰飯文章地址在此:知乎問(wèn)答之 Python 切片整理碉哑,和如果你去擺地?cái)?/a>性質(zhì)類(lèi)似挚币。
參考
Python 官方文檔-術(shù)語(yǔ)表 slice
Python 官方文檔-Python 標(biāo)準(zhǔn)庫(kù) 內(nèi)置函數(shù) slice()