python进阶——高级特性(一)切片

本文最后更新于:1 年前

(一)概述

在编程过程中,Python提供了很多高级特性,用于精简代码,提高运行速度或者节省空间。

该系列将会介绍切片,迭代,迭代器,列表生成式和生成器。

装饰器实际上也算是高级特性的一部分,但为了文章的连贯,写在了python基础——函数(三)中,如希望更多了解装饰器,请移步此博客。

(二)切片

1. 概述:

Python中对序列性对象的一种高级索引方法,可以取出序列中的一个范围对应的元素,且范围不一定连续,长度和频率不一定固定。

切片不会改变原值,返回的结果类型和切片对象的类型是一致的,可以理解为其返回的是切片对象的子序列——字符串切片返回字符串,列表切片返回列表。

切片实际上是一种浅拷贝,其生成的子序列是对原版的拷贝。

2. 基本索引:

Python中的序列性对象有两种索引方式——正索引和负索引。

以索引序列list_use为例,index为索引下标,list_use[index]表示对应元素,我们有:

list_use元素 1 2 3 4 5 6 7 8 9 10
正索引index 0 1 2 3 4 5 6 7 8 9
负索引index -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

正索引从0开始,0对应首元素;负索引从-1开始,-1对应末元素。

正负索引共同构成了Python索引的有效范围,基本索引中如果索引超出了有效范围会报错。

3. 切片操作:

(1)语法格式:

object[start_index : end_index : step]

完整的切片表达式如上,会包括三个参数,参数之间用":"分割。

  • step:先介绍step是为了理解后面两个索引的缺省情况。

    step是指切片的步长,可正可负,绝对值代表步长大小,正负性代表了步长的方向——正步长表示从左向右取值,负步长表示从右往左取值。

    step可以缺省,默认值为1,表示逐个元素取值,不会跳过任何一个元素。

  • start_index:表示起始索引,起始索引被包括到了切片子序列中。

    起始索引可以缺省,表示从被切片对象的某一端开始,如果步长为正,表示从最左端开始,如果为负,则从最右端开始。

  • end_index:表示终止索引,终止索引不会包括到切片子序列中。

终止索引可以缺省,表示从被切片对象的某一端开始,如果步长为正,表示从最右端开始,如果为负,则从最左端开始。

截断:在切片中,start_index和end_index允许绝对值大于被切片序列的长度,也就是超过索引的有效范围。此时不会发生报错,而是发生截断——所有的超出部分被自动忽略,只选取有效部分进行切片。

三个参数的组合必须正确:当start_index对应位置在end_index对应位置左侧时step应>0;当start_index对应位置在end_index对应位置右侧时step应<0,使用正索引还是负索引均可以,是否存在截断均可以,但必须符合上面的要求。

(2)举例:
  • 切单一值:

    1
    2
    3
    4
    5
    6
    7
    8
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[0])
    print(a[9])
    print(a[5])
    # 运行结果:
    # 0
    # 9
    # 5
  • 切完整对象:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[0:10])
    print(a[:])
    print(a[0:])
    print(a[-1::-1])
    # 运行结果:
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
  • start_index>0,end_index>0,step>0:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 运行结果:
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[2:7:1])
    print(a[2:8:2])
    print(a[1:19:3])
    print(a[5:233])
    # 运行结果:
    # [2, 3, 4, 5, 6]
    # [2, 4, 6]
    # [1, 4, 7]
    # [5, 6, 7, 8, 9]
  • start_index>0,end_index>0,step<0:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 运行结果:
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[7:2:-1])
    print(a[8:2:-2])
    print(a[19:1:-3])
    print(a[233:5:-1])
    # 运行结果:
    # [7, 6, 5, 4, 3]
    # [8, 6, 4]
    # [9, 6, 3]
    # [9, 8, 7, 6]
  • start_index<0,end_index<0,step>0:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[-7:-2:1])
    print(a[-8:-2:2])
    print(a[-19:-1:3])
    print(a[-233:-5:1])
    # 运行结果:
    # [3, 4, 5, 6, 7]
    # [2, 4, 6]
    # [0, 3, 6]
    # [0, 1, 2, 3, 4]
  • start_index<0,end_index<0,step<0:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 运行结果:
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[-2:-7:-1])
    print(a[-2:-8:-2])
    print(a[-1:-19:-3])
    print(a[-5:-233:-1])
    # 运行结果:
    # [8, 7, 6, 5, 4]
    # [8, 6, 4]
    # [9, 6, 3, 0]
    # [5, 4, 3, 2, 1, 0]
  • start_index>0,end_index<0,step>0:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[2:-2:1])
    print(a[4:-1:2])
    print(a[3:-3:3])
    print(a[0:-5:1])
    # 运行结果:
    # [2, 3, 4, 5, 6, 7]
    # [4, 6, 8]
    # [3, 6]
    # [0, 1, 2, 3, 4]
  • start_index>0,end_index<0,step<0:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[8:-8:-1])
    print(a[6:-9:-2])
    print(a[123:-7:-3])
    print(a[6:-15:-1])
    # 运行结果:
    # [8, 7, 6, 5, 4, 3]
    # [6, 4, 2]
    # [9, 6]
    # [6, 5, 4, 3, 2, 1, 0]
  • start_index<0,end_index>0,step>0:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[-2:2:-1])
    print(a[-4:1:-2])
    print(a[-3:3:-3])
    print(a[-1:5:-1])
    # 运行结果:
    # [8, 7, 6, 5, 4, 3]
    # [6, 4, 2]
    # [7, 4]
    # [9, 8, 7, 6]
  • start_index<0,end_index>0,step<0:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[-8:8:1])
    print(a[-6:9:2])
    print(a[-7:7:3])
    print(a[-9:5:1])
    # 运行结果:
    # [2, 3, 4, 5, 6, 7]
    # [4, 6, 8]
    # [3, 6]
    # [1, 2, 3, 4]
  • 缺省:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[::])
    print(a[5::])
    print(a[-5::])
    print(a[:4:])
    print(a[:-6:])
    print(a[::2])
    print(a[::-2])
    print(a[3::2])
    print(a[-7::1])
    print(a[7::-2])
    print(a[-3::-1])
    print(a[:7:2])
    print(a[:-3:1])
    print(a[:-7:-2])
    print(a[:3:-1])

    # 运行结果:
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # [5, 6, 7, 8, 9]
    # [5, 6, 7, 8, 9]
    # [0, 1, 2, 3]
    # [0, 1, 2, 3]
    # [0, 2, 4, 6, 8]
    # [9, 7, 5, 3, 1]
    # [3, 5, 7, 9]
    # [3, 4, 5, 6, 7, 8, 9]
    # [7, 5, 3, 1]
    # [7, 6, 5, 4, 3, 2, 1, 0]
    # [0, 2, 4, 6]
    # [0, 1, 2, 3, 4, 5, 6]
    # [9, 7, 5]
    # [9, 8, 7, 6, 5, 4]

    切片除了用于列表,还可以用于其他序列对象,此处不再举例。


python进阶——高级特性(一)切片
https://github.com/xiaohei07/xiaohei07.github.io/2023/07/13/python进阶——高级特性(一)切片/
作者
07xiaohei
发布于
2023年7月13日
许可协议