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
vibbow
V2EX  ›  Python

Python语法很奇怪啊

  •  
  •   vibbow · 2012-01-02 14:34:04 +08:00 · 5947 次点击
    这是一个创建于 4495 天前的主题,其中的信息可能已经有所发展或是发生改变。
    food = ["spam", "spam", "eggs", "sausages", "spam"]
    print food[2:4]

    为什么只打印 eggs 和 sausages 呢?
    难道不应该是index从2到4么?
    25 条回复    1970-01-01 08:00:00 +08:00
    phus
        1
    phus  
       2012-01-02 14:36:24 +08:00
    python想达到这样的一个效果:
    food[a:c] = food[a:b] + food[b:c]
    所以slice的区间就是前闭后开。
    guolin
        2
    guolin  
       2012-01-02 14:44:27 +08:00
    不奇怪,习惯就好了,省掉了开闭区间的麻烦。
    vibbow
        3
    vibbow  
    OP
       2012-01-02 14:52:01 +08:00
    对Python各种不适应
    算鸟,还是走 PHP + C# / C++ 路线吧...
    binux
        4
    binux  
       2012-01-02 14:58:21 +08:00
    这不是正常的吗?
    即使是C++ STL的copy,find
    JS的Array.slice

    不都是这样前闭后开的吗?
    cmonday
        5
    cmonday  
       2012-01-02 15:15:06 +08:00
    我想问问哪门语言的子数组不是这么处理,而是像LZ说的前后都闭区间的?
    Mutoo
        6
    Mutoo  
       2012-01-02 15:15:09 +08:00
    我一开始也不适应,要是python能识别 [a,b] [a,b) (a,b] (a,b) 就好了
    vibbow
        7
    vibbow  
    OP
       2012-01-02 16:01:07 +08:00
    关键是Python用的这个太尼玛像数学符号…
    range的话又用的小括号…
    ant_sz
        8
    ant_sz  
       2012-01-02 17:42:59 +08:00
    好好体会 simple, sometimes native 的感觉,我觉得这个感觉很好的
    clino
        9
    clino  
       2012-01-02 22:01:31 +08:00
    @vibbow 其实这个习惯就好了,而且我想这个设计应该是经过深思熟虑的,因为这个而放弃一门语言实在是...
    range 是函数不能和这个相比较
    flyingkid
        10
    flyingkid  
       2012-01-02 22:21:56 +08:00
    如果是这样,那就学习ruby吧,爽到底
    alsotang
        11
    alsotang  
       2012-01-02 23:40:01 +08:00
    @clino 对啊。。怎么能因为这个而放弃一门语言呢。1L不是已经给出这么设计的道理来了吗。。。C++的stl里面,xxx.end()也是指向最后一个元素的后一个位置呢。
    range是个函数,而调用函数一般都使用()括号,这个很正常嘛。习惯就好,用python比背PHP的各种函数名方便多了。
    sqbing
        12
    sqbing  
       2012-01-02 23:40:50 +08:00
    当然不是,从2开始,止于4前。
    vibbow
        13
    vibbow  
    OP
       2012-01-03 06:53:50 +08:00
    现在主要用PHP,曾经还学过Haskell
    Python的这一块和上两者一比较,用法就完全的不一样了。
    ectotherm
        14
    ectotherm  
       2012-01-03 07:57:03 +08:00
    程序中表示切片、迭代等等都喜欢用半闭区间,也就前闭后开,这样很方便的。包括C++ STL在内的很多库都这么干。
    ywjno
        15
    ywjno  
       2012-01-03 09:02:36 +08:00
    换用ruby吧,支持前闭后开跟前闭后闭
    miukal
        16
    miukal  
       2012-01-03 09:05:46 +08:00
    既然这个语法叫切片,可以把[]里的数字理解成切的位置而不是元素索引。
    比如有5个元素abcde
    |a|b|c|d|e|
    从0位置开始一共可以切6刀,所以[2:4]就是第2刀到第4刀之间的元素c,d
    levn
        17
    levn  
       2012-01-03 09:19:17 +08:00
    drop 2 . take 4 $ the_list
    1st
        18
    1st  
       2012-01-03 10:18:19 +08:00
    我记得Learning Python上写的就是这个意思。RT @miukal: 既然这个语法叫切片,可以把[]里的数字理解成切的位置而不是元素索引。
    比如有5个元素abcde
    |a|b|c|d|e|
    从0位置开始一共可以切6刀,所以[2:4]就是第2刀到第4刀之间的元素c,d
    clino
        19
    clino  
       2012-01-03 21:54:26 +08:00
    @miukal 解释得非常好,谢谢!这样就很清楚了.
    falconeye
        20
    falconeye  
       2012-01-09 17:10:18 +08:00
    @miukal 进一步解释一下 food[2:-1]吧
    clino
        21
    clino  
       2012-01-09 17:58:00 +08:00
    @falconeye
    |a|b|c|d|e|
    0 1 2 3 4 5
    -5-4-3-2-1 0
    2指的是b后面那一刀,-1指的是d后面那一刀,所以还是 ['c', 'd']
    est
        22
    est  
       2012-01-09 18:01:08 +08:00
    @clino 如果切片是复数是不是可以突破一次元的天际了?

    'abcdef'[1:2j]
    SkyFvcker
        23
    SkyFvcker  
       2012-01-31 17:23:16 +08:00
    LZ孤陋寡闻被各楼鄙视。。。
    yy77
        24
    yy77  
       2012-01-31 17:46:37 +08:00
    irb(main):005:0> food = ["1","2","3","4","5"][2..4]
    => ["3", "4", "5"]
    sandhat
        25
    sandhat  
       2012-02-02 15:32:22 +08:00
    一个关于前闭后开的传说~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3138 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:36 · PVG 22:36 · LAX 07:36 · JFK 10:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.