slice()函数在Python中做了什么? (与切片表示法相比)

时间:2016-11-30 18:59:38

标签: python function slice

我想评论同名的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方法。

1 个答案:

答案 0 :(得分:1)

编辑纠正“停止”。

这两个符号是一致的,也许您会0None混淆? 0是一个职位,None就是缺席职位。引用源代码(Objects/sliceobject.c):“ start,stop和step是带有None的python对象,表示不存在索引。

None0对于起始位置是相同的。

>>> 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'

那里没有矛盾。