Python进阶之路 4.2.2 分片

    xiaoxiao2022-07-07  217

    4.2.2 分片

    分片(slicing)操作是从序列A中获取一个子序列B。序列A可以称为父序列。从A中获取B,需要指定B在A中的开始索引和结束索引,因此,分片操作需要指定两个索引。

    由于字符串可以看作字符的序列,所以可以用序列的这个分片特性截取子字符串。

    [例 4.10] 通过分片操作获取一个URL的以及域名和完整的域名。

    url = 'https://www.baidu.com' print(url[8:15]) #输出结果:www.bai print(url[8:21]) #输出结果:www.baidu.com

    输出结果:

    www.bai www.baidu.com

    在上面的代码中,使用url[8:15]来截取url中的"www.bai",其中8和15是url中的两个索引。可以看到,两个索引之间要使用冒号(:)分隔。意思就是从url中截取第8-第15个字符串之间的内容。

    省略子序列的索引

    首先看一个用分片截取数字序列的例子。

    [例 4.11] 通过分片操作截取numbers序列中的某个子序列。

    numbers = [1,2,3,4,5,6,7,8] print(numbers[3:5]) #输出结果:[4, 5] print(numbers[0:1]) #输出结果:[1] print(numbers[5:8]) #输出结果:[6, 7, 8] print(numbers[-3:-1]) #输出结果:[6, 7]

    输出结果:

    [4, 5] [1] [6, 7, 8] [6, 7]

    [例 4.12] 通过将结束索引设为0,获取一个空序列

    numbers = [1,2,3,4,5,6,7,8] print(numbers[3:0]) #输出结果:[]

    输出结果:

    []

    Python语言规定,如果结束索引比开始索引晚出现,那么就会返回空序列。在这里索引0比索引3晚出现。如果要使用负数作为索引,并且获取的子序列的最后一个元素与父序列的最后一个元素相同,那么可以省略结束索引,或结束索引用正整数。

    [例 4.13] 使用负数作为开始索引,并省略结束索引。

    numbers = [1,2,3,4,5,6,7,8] print(numbers[-3:]) #省略了结束索引,输出结果:[6,7,8] print(numbers[-3:8]) #结束索引用了正整数作为索引,输出结果[6,7,8]

    输出结果:

    [6, 7, 8] [6, 7, 8]

    这种省略索引的方式统一适用于开始索引。

    [例 4.14] 省略了开始索引

    numbers = [1,2,3,4,5,6,7,8] print(numbers[:3]) #截取了父序列中前3个元素,输出结果:[1,2,3]

    输出结果:

    [1, 2, 3]

    如果开始索引和结束索引都不指定,那么会复制整个子序列。

    [例 4.15] 下面的代码通过省略开始索引和结束索引,复制了整个序列。

    numbers = [1,2,3,4,5,6,7,8] print(numbers[:]) #输出结果:[1,2,3,4,5,6,7,8]

    输出结果:

    [1,2,3,4,5,6,7,8]

    2.设置步长

    在对序列分片时,默认的步长是1,也就是说,获取的子序列的元素都是相邻的。如果要获取不相邻的元素,就需要设置步长。例如,要获取索引为1、3、5、7的元素作为子序列的元素,就需要将步长设置为2。

    [例 4.16] 通过改变分片操作的步长,获取元素不相邻的子序列。

    numbers = [1,2,3,4,5,6,7,8,9] print(numbers[0:9:2]) #输出结果:[1,3,5,7,9]

    输出结果:

    [1, 3, 5, 7, 9]

    在上面的代码中,使用numbers[0:9:2]获取了索引为1、3、5、7、9的元素作为子序列的元素,其中2是步长,可以看到,开始索引、结束索引和步长之间都用冒号分隔(:)。

    其实,开始索引、结束索引和步长都是可以省略的。

    [例 4.17] 下面的代码在分片时指定步长,但省略了开始索引以及结束索引。

    numbers = [1,2,3,4,5,6,7,8,9] print(numbers[:7:2]) #输出结果:[1, 3, 5, 7] print(numbers[::2]) #输出结果:[1, 3, 5, 7, 9] print(numbers[3::2]) #输出结果:[4, 6, 8]

    输出结果:

    [1, 3, 5, 7] [1, 3, 5, 7, 9] [4, 6, 8]

    步长不能为0,但是可以为负数。如果步长为0,则会抛出异常;如果步长是负数,分片会从序列的右侧开始,这时开始索引要大于结束索引。

    [例 4.18] 在使用分片步长时,分别使用了负数和0。

    numbers = [1,2,3,4,5,6,7,8,9] print(numbers[8:2:-2]) #输出结果:[9, 7, 5] print(numbers[8:2:-1]) #输出结果:[9, 8, 7, 6, 5, 4] print(numbers[1:6:0]) #步长为0,抛出异常

    输出结果:

    [9, 7, 5] [9, 8, 7, 6, 5, 4]

    在上面代码中,如果步长为负数,那么分片的开始索引需要大于结束索引。例如,numbers[8:2:-2]表示从索引为8的元素开始,往前扫描,直到索引为2的元素的上一个元素,也就是索引为3的元素为止。

    当然,如果使用负数作为步长,还有一些比较复杂的用法,得出这些用法的分片结果,需要动一下脑筋了。

    [例 4.19] 用负数作为分片步长。

    numbers = [1,2,3,4,5,6,7,8,9] print(numbers[::-3]) #步长为-3,从序列最后一个元素开始,一直到序列第一个元素结束,输出结果:[9, 6, 3] print(numbers[:3:-2]) #步长为-2,从序列最后一个元素开始,一直到索引为4的元素结束,输出结果:[9, 7, 5]

    输出结果:

    [9, 6, 3] [9, 7, 5]

    [例 4.20] 本例要求从Python控制台输入一个url和一个数字n。然后对url分片,获取url的Scheme和Host,最后根据这个数字生成一个包含1到n的序列,然后对该序列进行两次分片,一次获取序列中的所有奇数,一次获取序列中的所有偶数。并分两行错位显示。

    url = input("请输入一个https网址:") scheme = url[0:5] #分片获取url中的scheme host = url[8:] #分片获取url中的host print("scheme:",scheme) print("host:",host) str = input("请输入一个整数:") n = int(str) numbers = range(1,n) #生成包含1到n的数值类型的序列 numbers1 = numbers[0::2] #分片获取序列中的奇数 numbers2 = numbers[1::2] #分片获取序列中的偶数 for number in numbers1: #在第1行输出所有的奇数 print(number,end=" ") print("\n") for number in numbers2: #在第2行输出所有的偶数 print(number,end=" ")

    输出结果:

    请输入一个https网址:www.baidu.com scheme: www.b host: u.com 请输入一个整数:21 1 3 5 7 9 11 13 15 17 19 2 4 6 8 10 12 14 16 18 20
    最新回复(0)