溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python從菜鳥(niǎo)到高手(13):分片(Slicing)

發(fā)布時(shí)間:2020-07-10 18:02:48 來(lái)源:網(wǎng)絡(luò) 閱讀:1472 作者:androidguy 欄目:編程語(yǔ)言

??分片操作是從序列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é)果如下圖所示。

Python從菜鳥(niǎo)到高手(13):分片(Slicing)

??在上面的代碼中,使用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]。

  1. 省略子序列的索引
  2. 首先看一個(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é)果如下圖所示。

Python從菜鳥(niǎo)到高手(13):分片(Slicing)

??本例通過(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從菜鳥(niǎo)到高手(13):分片(Slicing)

??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é)果如下圖所示。

Python從菜鳥(niǎo)到高手(13):分片(Slicing)

??這種省略索引的方式統(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é)果如下圖所示。

Python從菜鳥(niǎo)到高手(13):分片(Slicing)

??如果開(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é)果如下圖所示。

Python從菜鳥(niǎo)到高手(13):分片(Slicing)

??在對(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é)果如下圖所示。

Python從菜鳥(niǎo)到高手(13):分片(Slicing)

??在上面的代碼中,使用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é)果如下圖所示。

Python從菜鳥(niǎo)到高手(13):分片(Slicing)

??步長(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é)果如下圖所示。

Python從菜鳥(niǎo)到高手(13):分片(Slicing)

??在上面的代碼中,如果步長(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從菜鳥(niǎo)到高手(13):分片(Slicing)

??本例要求從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)到高手(13):分片(Slicing)

《Python從菜鳥(niǎo)到高手》已經(jīng)出版,開(kāi)始連載了,購(gòu)買(mǎi)送視頻課程

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI