zoukankan      html  css  js  c++  java
  • <4>Python切片功能剖析

    引用文章:https://mp.weixin.qq.com/s/NZ371nKs_WXdYPCPiryocw

    切片基础法则:

    1)公式[i : n : m]i为起始位置索引(i首位0可省略)i+n为结束位置索引(n长度len(li)可省略)m为步长,默认1,禁止0

    2i, n同号:从序列的第i位索引起,向右取n-i位,按m间隔过滤。

            i, n异号:从序列的第i位索引起,向右取(len(list)-n)-i位,按m间隔过滤。

     

    切片法则推导:

    1)当m>0,且 i>0 时:从第 i 位起,取 n-i 位元素(i, n同号)  |   (lenlist)-n)-i 位元素(i, n异号)

    2)当m>0,且 i<0 时:从倒数第 |i| 位起,取 n-i 位元素(i, n同号)  |   (n-len(list))-i 位元素(i, n异号)

    3)当m<0 i>0 时:先翻转列表,从第 i 位起,取 n-i 位元素(i, n同号)  |   (lenlist)-n)-i 位元素(i, n异号)

    3)当m<0 i<0 时:先翻转列表,从倒数第 |i| 位起,取 n-i 位元素(i, n同号)  |   (n-len(list))-i 位元素(i, n异号)

     

    表示整个列表:其中 X >= len(li)

    li[0:X] == li[0:] == li[:X] == li[:] == li[::] == li[-X:X] == li[-X:]

     

    切片高级法则:

    切片的返回结果:一个新的序列,占用新的内存地址,是属于浅拷贝

     1 #: 切片返回新的序列,占用新的内存地址
     2 In[2]: li = [1,2,3,4]
     3 In[3]: lo=li[::]
     4 In[4]: id(li)
     5 Out[4]: 2316742428488
     6 In[5]: id(lo)
     7 Out[5]: 2316740137416
     8 
     9 #: 切片属于浅拷贝
    10 In[6]: lii = [1, [2,3,4], 3, 4]
    11 In[7]: loo = lii[:2]
    12 In[8]: id(lii[1])
    13 Out[8]: 2316742399880
    14 In[9]: id(loo[1])
    15 Out[9]: 2316742399880

    给切片赋值可迭代对象,可以达到列表实现拼接、替换的操作

    列表拼接:使用纯占位符将两个列表拼接成一个列表

    In[2]: li = [1, 2, 3, 4]
    
    #: 拼接到头部
    In[3]: li[:0] = [0]
    In[4]: li
    Out[4]: [0, 1, 2, 3, 4]
    
    #: 拼接到尾部
    In[5]: li[len(li):] = [5, 7]
    In[6]: li
    Out[6]: [0, 1, 2, 3, 4, 5, 7]
    
    #:拼接到中部
    In[7]: li[6:6] = [6]
    In[8]: li
    Out[8]: [0, 1, 2, 3, 4, 5, 6, 7]

    列表替换:使用非纯占位符将一个列表的部分内容替换为另一个列表内容

     1 In[2]: li = [1, 2, 3, 4]
     2 
     3 #: 头部替换
     4 In[3]: li[:3] = [7, 8, 9]
     5 In[4]: li
     6 Out[4]: [7, 8, 9, 4]
     7 
     8 #: 尾部替换
     9 In[5]: li[3:] = [5, 6, 7]
    10 In[6]: li
    11 Out[6]: [7, 8, 9, 5, 6, 7]
    12 
    13 #: 中部替换
    14 In[7]: li[2:4] = ['a', 'b']
    15 In[8]: li
    16 Out[8]: [7, 8, 'a', 'b', 6, 7]
    17 
    18 #: 非等长替换
    19 In[9]: li[2:4] = [1, 2, 3, 4]
    20 In[10]: li
    21 Out[10]: [7, 8, 1, 2, 3, 4, 6, 7]
    22 
    23 In[11]: li[2:6] = ['a']
    24 In[12]: li
    25 Out[12]: [7, 8, 'a', 6, 7]
    26 
    27 del li[2:3]  # [7, 8, 6, 7]

    自定义切片的功能:__getitem__() 方法用于切片功能

    怎么判断一个对象是否实现了这个方法呢?

    1 hasattr('abc', '__getitem__')

    迭代、迭代对象、迭代器?

    迭代:是一种遍历容器类型对象(例如字符串、列表、字典等等)的方式。

    迭代对象:实现__iter__() 魔术方法的对象都是可迭代对象。

    迭代器:

    •  可迭代对象不等于迭代器
    •  可迭代对象可以变为迭代器

      “一同两不同,两者都有__iter__(),迭代对象的__getitem__()变为__next__()就成为跌倒器

      可迭代对象只能被它遍历,迭代器却还可以自遍历

    要实现迭代器拥有切片的功能?添加__getitem__() 方法。

    通过借助 itertools 模块 islice() 方法,我们能实现迭代器切片,将两者的优势相结合,其主要用途在于截取大型迭代器(如无限数列、超大文件等等)的片段,实现精准的处理,从而大大地提升性能与效率。

  • 相关阅读:
    从Object对象中读取属性的值
    CentOS7安装Mysql
    CentOS初使用命令总结
    linux安装git、node、pm2
    将 ELASTICSEARCH 写入速度优化到极限
    Elasticsearch
    elasticsearch5.0.1集群索引分片丢失的处理
    ELASTICSEARCH健康red的解决
    使用linux远程登录另一台linux
    fiddler构造表单上传文件的请求
  • 原文地址:https://www.cnblogs.com/1fengchen1/p/10271157.html
Copyright © 2011-2022 走看看