V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
YaphetYin
V2EX  ›  Python

Python 的逆序 slice 切片

  •  
  •   YaphetYin ·
    filosfino · 2017-12-29 10:47:37 +08:00 · 3272 次点击
    这是一个创建于 2281 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Python 的切片相信大家已经很熟悉了,语法是这样的

    a[[start]:[end][:[step]]]
    

    其中索引为 end 的元素不会被包括进来。startendstepstep 前面的冒号都可以省略。这么多可以省略的,那么解释器是怎么设置默认值的呢?很有趣,解释器对正序和逆序切片的默认值设置是不一样的,我们在实战中看结果吧。

    全文用到的变量 a 长这样:

    a="0123456789"
    

    正序切片

    在正序切片中,默认值的设置为

    • start = 0
    • end = -1 后面一位,即切片会返回包括 str 最后一个元素
    • step = 1

    其中 end 的默认值为 -1 后面一位是什么意思呢?这里的 -1 指的是 index-1 的元素,即 str 的最后一个位置,在 a 中指的是 9 这个元素。那它后面一位是无意义的,但解释器执行的时候会切片到该元素的前一位,即 9

    下面是几种正序切片的常见用例

    a[:]
    a[0:]
    a[::]
    a[::1]
    a[0::1]
    >>> '0123456789'
    

    注意这里切片返回的结果不会包括索引为 -1 的元素

    a[:-1]
    >>> '012345678'
    
    a[:8]
    >>> '01234567'
    
    a[8:]
    >>> '89'
    
    a[:8:2]
    a[0:8:2]
    >>> '0246'
    

    逆序切片 (step 为负数)

    逆序切片的默认值就很有意思了,不注意的话非常容易混淆搞错边界索引,它的默认值是

    • start = -1
    • end = 0 前面一位,即切片会返回包括 str 第一个元素

    这里的逻辑是,从 start 元素开始,在其索引上依次加上 step,找到下一个索引直到 end,所以写逆序切片的时候,start 的索引是大于 end 的索引的。

    a
    >>> '0123456789'
    
    a[::-1]
    >>> '9876543210'
    
    a[0::-1]
    >>> '0'
    
    a[:0:-1]
    a[-1:0:-1]
    >>> '987654321'
    
    a[4::-1]
    >>> '43210'
    

    总结

    其实不难反推出来,默认的值并不是写死的,而是根据 step 值来从 start 或者 end 二者之一来用加上 step 依次推导,直到队列最前 /最后一个元素的。如果不熟悉的话,逆序切片很容易在边界上出错,也不直观,不易理解,最好使用其他等效的操作来替代。

    更多内容可以关注我的博客,主要分享生活、工作、读书中的一些心得感悟 http://blog.filosfino.com/

    8 条回复    2017-12-29 14:25:28 +08:00
    est
        1
    est  
       2017-12-29 10:54:53 +08:00   ❤️ 1
    直接拉到最后看广告。
    YaphetYin
        2
    YaphetYin  
    OP
       2017-12-29 11:59:41 +08:00
    @est 2333
    gleymonkey
        3
    gleymonkey  
       2017-12-29 12:06:42 +08:00
    抓紧复习一波
    Mitt
        4
    Mitt  
       2017-12-29 12:08:40 +08:00
    @est 熟知套路
    xpresslink
        5
    xpresslink  
       2017-12-29 13:50:28 +08:00
    在这里混的基本上没有小白,就你写的这东西的水平,就相当于在告诉大家母鸡会下蛋。
    所以不要浪费论坛资源了。
    newbieo0O
        8
    newbieo0O  
       2017-12-29 14:25:28 +08:00
    这不都是基础知识嘛,看下官方文档就明白了。
    新手最好直接看官方文档,网文质量参差不齐,还有很多皮毛,不连贯,都是碎片知识,很难系统学习。
    讲真,现在给小白做培训真的很赚钱。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   952 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:48 · PVG 05:48 · LAX 14:48 · JFK 17:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.