13.切片与下标运算符

在学习Python中,有一个概念很多人都会提到:切片,下面我谈谈对切片的理解;

注意:本主题不谈切片的参数含义,以及对序列数据的处理操作逻辑(这是很多人做过的事情)。

一、 [ ]下标(subscript)运算符与切片(slice)

  1. 什么是切片(slice)?
      下标运算是下标运算,切片与切片。这两个概念被很多人混淆了。只是在Python内置的[ ]运算符内置支持切片而已。
      什么是切片,Python专门提供了切片类型,切片是Python的一种数据类型,并提供切片语法来表达这种数据类型。
  s = slice(0,5,-1)

  官方文档中提供slice的帮助:

  class slice(object)
     |  slice(stop)
     |  slice(start, stop[, step])
     |  
     |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
     |  
  1. 怎么使用切片?
      Python提供两种切片使用方式,但是本质都一样:
        | - 对象方式,
        | - 内置切片语法方式,
  • 使用切片语法
    a = [1,2,3,4]
    print(a[0:3:1])
  • 使用切片对象
    a = [1,2,3,4]
    s = slice(0,3,1)
    print(a[s])
  1. 说明
    • 下标运算支持切片;
    • 下标运算作用于元组,列表,字典等多种结构类型,下标是被所有对象支持的,但不是所有对象的[]下标运算中都实现切片的逻辑,比如字典类型(其内部判定使用了切片,会抛出异常)。(下标常有,切片不常有,切片的语法搭配下标使用的独特语法[存在使用局限],也可以单独使用对象)
    • 切片内置语法,最终也是转换为切片对象使用。

二、在下标运算符[ ]重载中使用切片

  class A:
      def __getitem__(self, item):
          print(item)
  
      def __setitem__(self, key, value):
          print(key,value)

  
  a = A()
  a[1]
  a[1] = 30

  a[1:2:1]

输出结果:

  1
  1 30
  slice(1, 2, 1)

  
重载下标运算符适用切片

三、结论

  1. 下标是下标,切片是切片;
  2. 下标中使用一个参数的才是真正的下标,表示地址偏移。在重载中是一个整数参数。
  3. 使用了切片运算符号,会自动装箱为slice切片对象。如果不使用:就不是切片。
    切片的语法是在下标中使用合法,并且是语法格式是start:stop:stride,切片的运算数是三个,都是可选的。默认值都是None,None的含义,由下标[  ]运算符的实现决定。
    a[:]     # slice(None, None, None)
    a[::]    # slice(None, None, None)

附录:

  在Python提供不少的自动装箱的语法规则,其中***就是参数装箱与解箱的语法操作。
  Python真是一个实用的语言。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容