V2EX 首页   注册   登入
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请 登入
Sponsored by
唐茶 字节社
中文世界最好的电子书城
V2EX  ›  Python

Python语法很奇怪啊

By vibbow at 142 天前, 988 次点击
food = ["spam", "spam", "eggs", "sausages", "spam"]
print food[2:4]

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

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

'abcdef'[1:2j]
    23
SkyFvcker   113 天前
LZ孤陋寡闻被各楼鄙视。。。
    24
yy77   113 天前
irb(main):005:0> food = ["1","2","3","4","5"][2..4]
=> ["3", "4", "5"]
    25
sandhat   111 天前
一个关于前闭后开的传说~
Linode
关于   |   FAQ   |   我们的愿景   |   广告投放   |   工作空间   |   Gadget Lab   |   博客   |   上网首页   |   292 人在线   最高记录 362
创意工作者们的社区
Lovingly made by OLIVIDA
VERSION: 3.0.0-dev
♥ Do have a faith in what you're doing.