zoukankan      html  css  js  c++  java
  • 深入理解Python切片

    Python序列的切片很基础同时也很重要,最近看到一个[::-1]的表达,不明所以,查了一些资料并实际操作,对Python切片有了更深刻的认识,以下结合例子详细说明。
    先看下切片的基本语法,一般认为切片语法是[N:M],是个半闭合区间,等效于数学上[N,M)取值范围,取N不取M, N和M都可以省略,N<M,否则取不到值
    接着看上面的例子[::-1],双冒号好理解,[::]代表取整个序列,后面又带个-1是什么鬼?
    重新审视切片语法,原来完整的切片语法是[N:M:S],其中的S代表step,这么就好理解了

    看下面的例子,通过控制step可以更灵活的取数据,wonderful!

    >>> s
    [1, 2, 3, 4, 5, 6, 7, 8]
    >>> s[::]
    [1, 2, 3, 4, 5, 6, 7, 8]
    >>> s[::1]
    [1, 2, 3, 4, 5, 6, 7, 8]
    >>> s[::2]
    [1, 3, 5, 7]

    那step = -1是什么意思?[::-1]实操的结果如何,如何解释?

    >>> s[::-1]
    [8, 7, 6, 5, 4, 3, 2, 1]

    查询得知s可以为负数,并且s的正负对取切片的行为有影响,什么影响?2个方面:

    1.影响N,M的缺省值

    2.影响切片取值方向

    s缺省为1,如果>0,取切片从左向右取,缺省N=0,M=len(s)

    >>> s[0:len(s)]
    [1, 2, 3, 4, 5, 6, 7, 8]

    因为是从左往右取,所以要求N<M,否则取不到,这个规则同样适用于N,M为负数的情况,看下面的例子,第一个N=-1,M=-2,N>M,从左往右取,-2位置上在-1的左边,所以取不到,第二个N=-2,M=-1,从-2向右-1取,得7,符合上述规则!

    >>> s[-1:-2]
    []
    >>> s[-2:-1]
    [7]

    如果s<0,会如何

    缺省值:N= -1,M = -len(s)-1

    方向:从右向左取

    这就解释了[::-1]的结果,[::]代表取全序列,-1代表从右向左取步长为1

    >>> s[::-1]
    [8, 7, 6, 5, 4, 3, 2, 1]

    等效于

    >>> s[-1:-len(s)-1:-1]
    [8, 7, 6, 5, 4, 3, 2, 1]

    理解了以上原则,就容易理解以下切片的结果了,可以看到此时,例1,N>M,但可以取到值,例2,N<M取不到值,原因是s=-1,从右向左取值的缘故

    >>> s[-1:-2:-1]
    [8]
    >>> s[-2:-1:-1]
    []

     总之s的正负会影响切片取值方向,使用中需要特别注意。

    补充:

    上述结论也可以解释以下切片结果:

    >>> s="Hello World"
    >>> s[-5:0]
    ''
    >>> s[-5:-1]
    'Worl'
    >>> s[-5:1]
    ''
    >>> s[-5:0:-1]
    'W olle'
    >>> s[-5:1:-1]
    'W oll'
    >>>

  • 相关阅读:
    逆向工程工具介绍2-IDA
    汇编语言基础-1 基本语言元素
    Python常用标准库1-Turtle,Random,Time和Datetime
    Python的模块、包和库的概念
    Go语言的函数修饰符
    物理层2-物理层下面的传输媒体
    数据分析之两种用户分群方法(RFM和聚类)
    区间估计与假设检验公式
    源码分析过滤器与拦截器的区别
    Springboot拦截器使用及其底层源码剖析
  • 原文地址:https://www.cnblogs.com/jamesxu/p/11201612.html
Copyright © 2011-2022 走看看