我想评论同名的the post上接受的答案,但我太绿了。
那个答案," a [x:y:z]给出了与[slice(x,y,z)]"相同的结果,在我的尝试中没有证明是真的所以我是寻求更深入地理解slice()和切片表示法之间的差异。
我有一个串行协议,它有一个这样的消息体:Q0134CA24B。
如果我想收集该协议的元素,那么这样做会非常好:
>>> str = 'Q0134CA24B'
>>> cmd = slice(0,1)
>>> str[cmd]
'Q'
>>> cs = slice(-2,0)
>>> str[cs]
''
>>> cs
slice(-2, 0, None)
>>> str[cs]
''
>>> str[-2:None:None]
'4B'
那么,我做错了什么?与切片表示法相比,slice()是否有限?这对我来说非常有用,因为我经常使用串行协议,并且使用slice()定义字符字段将是传递此表示的pythonic方法。
答案 0 :(得分:1)
编辑纠正“停止”。
这两个符号是一致的,也许您会0
与None
混淆? 0
是一个职位,None
就是缺席职位。引用源代码(Objects/sliceobject.c
):“ start,stop和step是带有None的python对象,表示不存在索引。”
None
和0
对于起始位置是相同的。
>>> s = 'Q0134CA24B'
>>> s[:1]
'Q'
>>> s[0:1]
'Q'
对于停止,None
表示“直到序列结束”,而0
表示位置。
>>> s = 'Q0134CA24B'
>>> s[1:]
'0134CA24B'
>>> s[1:0]
''
>>> s[::-1] # Simple 'reverse' trick
'B42AC4310Q'
>>> s[:None:-1]
'B42AC4310Q'
>>> s[:0:-1]
'B42AC4310'
对于某个步骤,None
表示一个,但0
无效且会引发ValueError
,如果您使用[ ]
表示法或{{slice()
,则相同1}}。
举例(str
是变量的坏名称):
>>> s = 'Q0134CA24B'
>>> cmd = slice(0,1)
>>> s[cmd]
'Q'
>>> s[0:1]
'Q'
>>> cs = slice(-2,0)
>>> s[cs]
''
>>> s[-2:0]
''
>>> cs
slice(-2, 0, None)
>>> s[-2:None:None]
'4B'
>>> s[-2::]
'4B'
>>> cd = slice(-2,None,None)
>>> str[cd]
'4B'
那里没有矛盾。