您好,登錄后才能下訂單哦!
??分片操作是從序列A中獲取一個(gè)子序列B。序列A可以稱為父序列。從A中獲取B,需要指定B在A中的開(kāi)始索引和結(jié)束索引,因此,分片操作需要指定兩個(gè)索引。
??由于字符串可以看做是字符的序列,所以我們可以用序列的這個(gè)分片特性截取子字符串。
??本例通過(guò)分片操作獲取一個(gè)Url的一級(jí)域名和完整的域名。
url = 'https://geekori.com'
print(url[8:15]) # 運(yùn)行結(jié)果:geekori
print(url[8:19]) # 運(yùn)行結(jié)果:geekori.com
程序運(yùn)行結(jié)果如下圖所示。
??在上面的代碼中,使用url[8:15]來(lái)截取url中的“geekori”,其中8和15是url中的兩個(gè)索引。我們可以看到,兩個(gè)索引之間要使用冒號(hào)(:)分隔??赡苡械淖x者會(huì)發(fā)現(xiàn),索引15并不是“i”的索引,而是“.”的索引,沒(méi)錯(cuò),在指定子序列結(jié)束索引時(shí),要指定子序列最后一個(gè)元素的下一個(gè)元素的索引,因此,應(yīng)該指定“.”的索引,而不是“i”的索引。
??那么如果子序列的最后一個(gè)元素恰好是父序列的最后一個(gè)元素該怎么辦呢?例如,url中的最后一個(gè)元素是“m”,如果要截取“geekori.com”,子序列的結(jié)束索引應(yīng)該如何指定呢?其實(shí)子序列的結(jié)束索引只要指定父序列最后一個(gè)元素的索引加1即可。由于父索引最后一個(gè)元素“m”的索引是18,因此,要截取“geekori.com”,需要指定結(jié)束索引為19,也就是url[8:19]。
首先看一個(gè)用分片截取數(shù)字序列的例子。
本例通過(guò)分片操作截取numbers序列中的某個(gè)子序列。
numbers = [1,2,3,4,5,6,7,8]
print(numbers[3:5]) # 運(yùn)行結(jié)果:[4, 5]
print(numbers[0:1]) # 運(yùn)行結(jié)果:[1]
print(numbers[5:8]) # 運(yùn)行結(jié)果:[6, 7, 8]
print(numbers[-3:-1]) # 運(yùn)行結(jié)果:[6,7]
程序運(yùn)行結(jié)果如下圖所示。
??本例通過(guò)將結(jié)束索引設(shè)為0,獲取一個(gè)空序列。
numbers = [1,2,3,4,5,6,7,8]
print(numbers[-3:0]) # 運(yùn)行結(jié)果:[]
程序運(yùn)行結(jié)果如下圖所示。
??Python語(yǔ)言規(guī)定,如果結(jié)束索引比開(kāi)始索引晚出現(xiàn),那么就會(huì)返回空序列,在這里索引0比索引-3晚出現(xiàn)。如果要使用負(fù)數(shù)作為索引,并且獲取的子序列的最后一個(gè)元素與父序列的最后一個(gè)元素相同,那么可以省略結(jié)束索引,或結(jié)束索引用正整數(shù)。
本例使用負(fù)數(shù)作為開(kāi)始索引,并省略結(jié)束索引。
numbers = [1,2,3,4,5,6,7,8]
print(numbers[-3:]) # 省略了結(jié)束索引,運(yùn)行結(jié)果:[6, 7, 8]
print(numbers[-3:8]) # 結(jié)束索引用了正整數(shù)作為索引,運(yùn)行結(jié)果:[6, 7, 8]
程序運(yùn)行結(jié)果如下圖所示。
??這種省略索引的方式統(tǒng)一適用于開(kāi)始索引。
本例省略了開(kāi)始索引。
numbers = [1,2,3,4,5,6,7,8]
print(numbers[:3]) # 截取父序列中前3個(gè)元素作為子序列,運(yùn)行結(jié)果:[1, 2, 3]
程序運(yùn)行結(jié)果如下圖所示。
??如果開(kāi)始索引和結(jié)束索引都不指定,那么會(huì)復(fù)制整個(gè)子序列。
??本例下面的代碼通過(guò)省略開(kāi)始索引和結(jié)束索引,復(fù)制了整個(gè)序列。
numbers = [1,2,3,4,5,6,7,8]
print(numbers[:]) # 復(fù)制整個(gè)序列,運(yùn)行結(jié)果:[1, 2, 3, 4, 5, 6, 7, 8]
程序運(yùn)行結(jié)果如下圖所示。
??在對(duì)序列分片時(shí),默認(rèn)的步長(zhǎng)是1,也就是說(shuō),獲取的子序列的元素都是相鄰的。如果要獲取不相鄰的元素,就需要指定步長(zhǎng)。例如,要獲取索引為1、3、5的元素作為子序列的元素,就需要將步長(zhǎng)設(shè)為2。
??本例通過(guò)改變分片操作的步長(zhǎng),獲取元素不相鄰的子序列。
numbers = [1,2,3,4,5,6,7,8,9]
print(numbers[1:6:2]) # 指定步長(zhǎng)為2,運(yùn)行結(jié)果:[2, 4, 6]
程序運(yùn)行結(jié)果如下圖所示。
??在上面的代碼中,使用numbers[1:6:2]獲取了索引為1、3、5的元素作為子序列的元素,其中2是步長(zhǎng),我們可以看到,開(kāi)始索引、結(jié)束索引和步長(zhǎng)之間都用冒號(hào)分隔(:)。
??其實(shí),開(kāi)始索引,結(jié)束索引和步長(zhǎng)都是可以省略的。
本例在分片時(shí)指定步長(zhǎng),但省略了開(kāi)始索引以及結(jié)束索引。
numbers = [1,2,3,4,5,6,7,8,9]
print(numbers[:7:2]) # 省略了開(kāi)始索引,運(yùn)行結(jié)果:[1, 3, 5, 7]
print(numbers[::2]) # 省略了開(kāi)始索引和結(jié)束索引,運(yùn)行結(jié)果:[1, 3, 5, 7, 9]
print(numbers[3::2]) # 省略了結(jié)束索引,運(yùn)行結(jié)果:[4, 6, 8]
程序運(yùn)行結(jié)果如下圖所示。
??步長(zhǎng)不能為0,但可以是負(fù)數(shù)。如果步長(zhǎng)為0,會(huì)拋出異常,如果步長(zhǎng)是負(fù)數(shù),分片會(huì)從序列的右側(cè)開(kāi)始,這時(shí)開(kāi)始索引要大于結(jié)束索引。
??在使用分片步長(zhǎng)時(shí),分別使用了負(fù)數(shù)和0。
numbers = [1,2,3,4,5,6,7,8,9]
# 步長(zhǎng)為-2,從索引為8的元素開(kāi)始,一直到索引為3的元素,運(yùn)行結(jié)果:[9, 7, 5]
print(numbers[8:2:-2])
print(numbers[8:2:-1]) # 步長(zhǎng)為-1,運(yùn)行結(jié)果:[9, 8, 7, 6, 5, 4]
print(numbers[1:6:0]) # 步長(zhǎng)為0,會(huì)拋出異常
程序運(yùn)行結(jié)果如下圖所示。
??在上面的代碼中,如果步長(zhǎng)為負(fù)數(shù),那么分片的開(kāi)始索引需要大于結(jié)束索引。例如,numbers[8:2:-2]表示從索引為8的元素開(kāi)始,往前掃描,直到索引為2的元素的上一個(gè)元素,也就是索引為3的元素為止。
當(dāng)然,如果使用負(fù)數(shù)作為步長(zhǎng),還有一些比較燒腦的用法,得出這些用法的分片結(jié)果,需要?jiǎng)右幌履X筋。
??本例將負(fù)數(shù)作為分片步長(zhǎng)。
numbers = [1,2,3,4,5,6,7,8,9]
# 步長(zhǎng)為-3,從序列最后一個(gè)元素開(kāi)始,一直到序列第一個(gè)元素結(jié)束,運(yùn)行結(jié)果:[9, 6, 3]
print(numbers[::-3])
# 步長(zhǎng)為-2,從序列的最后一個(gè)元素開(kāi)始,一直到索引為4的元素結(jié)束,運(yùn)行結(jié)果:[9, 7, 5]
print(numbers[:3:-2])
程序執(zhí)行結(jié)果如下圖所示。
??本例要求從Python控制臺(tái)輸入一個(gè)Url和一個(gè)數(shù)字n。然后對(duì)Url分片,獲取Url的Scheme和Host,最后根據(jù)這個(gè)數(shù)字生成一個(gè)包含1到n的序列,然后對(duì)該序列進(jìn)行兩次分片,一次獲取序列中的所有奇數(shù),一次獲取序列中的所有偶數(shù),并分兩行錯(cuò)位顯示。
url = input("請(qǐng)輸入一個(gè)Https網(wǎng)址:")
scheme = url[0:5] # 分片獲取Url中的Scheme
host = url[8:] # 分片獲取Url中的Host
print("scheme:", scheme)
print("host:",host)
str = input("請(qǐng)輸入一個(gè)整數(shù):")
n = int(str);
numbers = range(1,n) # 產(chǎn)生包含1到n的數(shù)值類型的序列
numbers1 = numbers[0::2] # 分片獲取序列中的奇數(shù)
numbers2 = numbers[1::2] # 分片獲取序列中的偶數(shù)
for number in numbers1: # 在第1行輸出所有的奇數(shù)
print(number, end= " ")
print("")
print(" ",end="")
for number in numbers2: # 在第2行錯(cuò)位輸出所有的偶數(shù)
print(number, end= " ")
程序運(yùn)行結(jié)果如下圖所示。
《Python從菜鳥(niǎo)到高手》已經(jīng)出版,開(kāi)始連載了,購(gòu)買(mǎi)送視頻課程
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。