Python 中的 slice() 函数有什么作用? (与切片符号相比)

What does the slice() function do in Python? (compared to slice notation)

我想对同名 上已接受的答案发表评论,但我太菜鸟了。

这个答案 "a[x:y:z] is gives the same result as a[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 方式。

编辑更正 "stop"。

这两个表示法是一致的,也许你混淆了0None0 是位置,None 是没有位置。引用源代码 (Objects/sliceobject.c):“start、stop 和 step 是 python 个对象,其中 None 表示不存在索引。

None0 是相同的起始位置。

>>> s = 'Q0134CA24B'
>>> s[:1]
'Q'
>>> s[0:1]
'Q'

止损,None表示"through to the end of the sequence",而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().

以您为例(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'

那里没有不一致。