slice()函数在Python中做了什么?

时间:2015-07-19 13:36:25

标签: python python-2.7 python-3.x slice

首先,我想澄清一下这个问题:它是关于slice()函数,不是切片的列表或字符串,如a[5:4:3]

文档提到这个函数在NumPy中使用并且没有给出使用示例(它说如何使用它但它不是说何时使用它)。而且,我永远看不到任何Python程序中使用的这个函数。

在使用普通Python(没有NumPy或SciPy)编程时应该何时使用slice()函数?任何例子都将不胜感激。

4 个答案:

答案 0 :(得分:26)

a[x:y:z]a[slice(x, y, z)]的结果相同。 slice对象的一个​​优点是它可以作为单个对象存储和检索,而不是存储xyz

它通常用于让用户定义自己的切片,以后可以应用于数据,而无需处理许多不同的情况。

答案 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]