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"。
这两个表示法是一致的,也许你混淆了0
和None
? 0
是位置,None
是没有位置。引用源代码 (Objects/sliceobject.c
):“start、stop 和 step 是 python 个对象,其中 None 表示不存在索引。”
None
和 0
是相同的起始位置。
>>> 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'
那里没有不一致。
我想对同名
这个答案 "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"。
这两个表示法是一致的,也许你混淆了0
和None
? 0
是位置,None
是没有位置。引用源代码 (Objects/sliceobject.c
):“start、stop 和 step 是 python 个对象,其中 None 表示不存在索引。”
None
和 0
是相同的起始位置。
>>> 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'
那里没有不一致。