• 流畅的Python读书笔记(三)序列:切片应用及原理浅析


    活动地址:CSDN21天学习挑战赛

    流畅的Python读书笔记(三)序列:切片应用及原理浅析


    本篇笔记简略介绍切片的使用,同时会简单说明,切片操作时,Python解释器会进行哪些调用。

    假定你对切片有了一定的了解。

    切片的使用

    切片较重要的作用有两个:提取感兴趣的数据;透过切片修改原序列

    • 提取感兴趣的数据

      • 先简单提一下切片语法。

        语法:对于一个序列x。可以使用x[a:b:c]的方式对其进行切片。a表示切片起始索引,b表示切片结束索引,c表示切片步长。

        切片操作的范围有一个口诀,左闭右开,就是说,切片范围为[a,b),能够取到下标为a的元素,取不到下标为b的元素。而切片步长是指从起始下标a开始,每次加上c后,取下一个元素。c可以省略,当省略时,c的值默认为1。当c为正数时,若a省略,则a默认为序列起始,即a=0,若b省略,则b默认为序列结尾,即b=len(x);当c为负数时,若a省略,则a默认为序列末尾,即a=-1,若b省略,则b默认为序列开始,即b= —(len(x) + 1)

        示例:

        >>> l = list(range(10))
        >>> l
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        >>> l[2:5]
        [2, 3, 4]
        >>> l[:]
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        >>> l[-1:-(len(l) + 1):-1]
        [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
    • 透过切片修改原序列

      • 如果把切片放在赋值语句的左边,或把它作为del操作的对象,我们就可以对序列进行嫁接、切除或就地修改操作。

        >>> l = list(range(10))
        >>> l
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        >>> l[2:5] = [20, 30]
        >>> l
        [0, 1, 20, 30, 5, 6, 7, 8, 9]
        >>> del l[5:7]
        >>> l
        [0, 1, 20, 30, 5, 8, 9]
        >>> l[3::2] = [11, 22]
        >>> l
        [0, 1, 20, 11, 5, 22, 9]
        >>> l[2:5] = 100  ①
        Traceback (most recent call last):
          File "", line 1, in <module>TypeError: can only assign an iterable >>> l[2:5] = [100]
        >>> l
        [0, 1, 100, 22, 9]
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17

        ①如果赋值的对象是一个切片,那么赋值语句的右侧必须是个可迭代对象。即便只有单独一个值,也要把它转换成可迭代的序列。


    前面提到了切片的范围是左闭右开,即[a,b)。下面简单说一下为什么是这样。

    为什么切片和区间会忽略最后一个元素

    • 当只有最后一个位置信息时,可以很快推断出切片和区间中有几个元素。比如切片x[:4],我们可以通过4直接判断出,切片中有4个元素。

    • 起始位置和终止位置都已知时,推断切片和区间中有几个元素。比如切片x[a:b],我们可以直接推断出,切片中有b-a个元素。

    • 便于分隔序列。比如序列x,向将其中的数据从中间某个元素处分隔开,那么找到分隔点的下标索引mid,然后切片x[:mid],x[mid:]

    Python解释器对[]的处理

    假定现有一个序列,这里具体一点,就是一个列表seq。对其进行切片seq[start:stop:step], 在前面这个表达式求值时,Python解释器会调用seq.__getitem__(slice(start, stop, step))

    上面slice(start, stop, step)会返回一个slice对象。

    • 优化切片代码

      先说明会用到的文件animals.txt,其中的内容如下:

      name____spe__age
      Tom    Cat   1
      Jerry  Mouse 1
      
      • 1
      • 2
      • 3
      • 之前,我们对序列切片都是在[]中直接指定切片范围。比如:
      infos = open('animals.txt', 'r')
      # 提取动物名称
      for info in infos:
          print(info[0:5])
      
      #输出结果为:
      #name_
      #Tom
      #Jerry
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 如何实现优化?通过slice对象进行切片,进而使代码可读性增强。
      infos = open('animals.txt', 'r')
      animal_name = slice(0, 5)  #这是最重要的优化,提高了代码可读性
      print(animal_name)
      print(type(animal_name))
      # 提取动物名称
      for info in infos:
          print(info[animal_name])
      
      #输出结果为:
      #slice(0, 5, None)
      #
      #name_
      #Tom  
      #Jerry
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

    参考资料

    • 流畅的Python
  • 相关阅读:
    自动化设备制造行业常见管理难题及解决方案
    【死磕slam14】slambook2第五讲 详解joinMap.cpp
    Springcloud----Nacos配置中心
    Open AI开发者大会:AI“科技春晚”
    数据库数据恢复—Oracle数据库报错ORA-01110错误的数据恢复案例
    用C++ Thread实现简单的socket多线程通信
    web前端期末大作业——网页制作基础大二dw作业——动画漫展学习资料电影模板(6页)
    【SpringMVC】实现增删改查(附源码)
    74. 搜索二维矩阵
    项目工作中的有效沟通:提升团队协作效率的关键
  • 原文地址:https://blog.csdn.net/m0_52339560/article/details/126372608