首先,我想澄清一下这个问题:它是关于slice()
函数,不是切片的列表或字符串,如a[5:4:3]
。
文档提到这个函数在NumPy中使用并且没有给出使用示例(它说如何使用它但它不是说何时使用它)。而且,我永远看不到任何Python程序中使用的这个函数。
在使用普通Python(没有NumPy或SciPy)编程时应该何时使用slice()
函数?任何例子都将不胜感激。
答案 0 :(得分:26)
a[x:y:z]
与a[slice(x, y, z)]
的结果相同。 slice
对象的一个优点是它可以作为单个对象存储和检索,而不是存储x
,y
和z
。
它通常用于让用户定义自己的切片,以后可以应用于数据,而无需处理许多不同的情况。
答案 1 :(得分:4)
不,不是全部!
由于已经提到了对象,首先你必须知道切片是一个类,不是函数返回一个对象。
第二次使用slice()实例是为了将参数传递给 getitem ()和 getslice ()方法,当你创建自己的行为就像一个字符串,列表和其他支持切片的对象。
当你这样做时:
print "blahblah"[3:5]
自动转换为:
print "blahblah".__getitem__(slice(3, 5, None))
因此,当您编写自己的索引和切片对象时:
class example:
def __getitem__ (self, item):
if isinstance(item, slice):
print "You are slicing me!"
print "From", item.start, "to", item.stop, "with step", item.step
return self
if isinstance(item, tuple):
print "You are multi-slicing me!"
for x, y in enumerate(item):
print "Slice #", x
self[y]
return self
print "You are indexing me!\nIndex:", repr(item)
return self
试一试:
>>> example()[9:20]
>>> example()[2:3,9:19:2]
>>> example()[50]
>>> example()["String index i.e. the key!"]
>>> # You may wish to create an object that can be sliced with strings:
>>> example()["start of slice":"end of slice"]
较旧的Python版本支持使用 getslice ()代替 getitem ()的方法。检查 getitem ()是否有切片是一个好习惯,如果我们做了,则将其重定向到 getslice ()方法。这样您就可以完全向后兼容。
这就是numpy如何使用slice()对象进行矩阵操作,显然它是间接地在任何地方使用。
答案 2 :(得分:3)
(使用函数语义)调用slice
类实例化一个slice
对象(开始,停止,步进),您可以在以后的程序中将其用作切片说明符:
>>> myname='Rufus'
>>> myname[::-1] # reversing idiom
'sufuR'
>>> reversing_slice=slice(None,None,-1) # reversing idiom as slice object
>>> myname[reversing_slice]
'sufuR'
>>> odds=slice(0,None,2) # another example
>>> myname[odds]
'Rfs'
如果您经常使用一个切片,则最好在多个程序区域中使用常量,这样可以省去保留2或3个必须在其中键入的引用的麻烦 每次。
当然,它的确使它看起来像一个索引,但是使用Python一段时间后,您会了解到一切都不是乍看起来的样子,因此建议您更好地命名变量(就像我对{{ 1}}和不清楚的reversing_slice
。
答案 3 :(得分:2)
从你的问题我相信你正在寻找一个例子。因此,当我尝试slice
来自range(1, 20)
的列表,其步骤为 3
>>> x = range(1, 20)
>>> x[1:20:3]
[2, 5, 8, 11, 14, 17]
>>> x[slice(1, 20, 3)]
[2, 5, 8, 11, 14, 17]