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

slice()函数在Python中做什么?,python,python-2.7,python-3.x,slice,Python,Python 2.7,Python 3.x,Slice,首先,我想澄清一个问题:它是关于函数的,而不是像a[5:4:3]那样的列表片段或字符串 文档中提到此功能在NumPy中使用,但没有给出使用示例(说明如何使用,但没有说明何时使用)。此外,我从未见过在任何Python程序中使用此函数 在使用普通Python编程时(没有NumPy或SciPy),什么时候应该使用slice()函数?任何示例都将不胜感激。a[x:y:z]给出与a[slice(x,y,z)]相同的结果。切片对象的优点之一是它可以作为单个对象存储和检索,而不是存储x、y和z 它通常用于让用

首先,我想澄清一个问题:它是关于函数的,而不是像
a[5:4:3]
那样的列表片段或字符串

文档中提到此功能在NumPy中使用,但没有给出使用示例(说明如何使用,但没有说明何时使用)。此外,我从未见过在任何Python程序中使用此函数


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

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


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

从您的问题中,我相信您正在寻找一个示例。因此,当我尝试
范围(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]
不,还没完

正如前面提到的对象一样,首先您必须知道slice是一个类,而不是一个返回对象的函数

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()对象进行矩阵操作的方式,很明显,它经常在任何地方间接使用。

(使用函数语义)调用
slice
类实例化
slice
对象(start、stop、step),您可以在以后的程序中将其用作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一段时间后,您会发现,一切都不是乍看之下的样子,因此我建议更好地命名变量(就像我用
反转切片
做的那样,与不太清楚的
几率
相比。

好吧,我明白了。所以,现在没有更多的情况可以使用
切片()
?@ForceBru:就像在编程中一样,使用只受你的创造力的限制;)很少需要自己创建
切片
对象。使用
切片
对象的最常见情况是当您编写自己的序列类型并希望支持对其包含的项进行切片时。每当其他代码在您的ode>\uuuuuuGetItem\uuuuuuuuuuuuuuuuuuuuuuuuu
方法和
切片对象(较旧版本的Python使用
\uuuuuuuuuuu getslice\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu>方法代替了这种方法,但自2.6以来,这种方法一直被弃用,Python 3中对它的@Blckknght是的,很好的解释。没有及时看到它,所以我添加了一个答案。至少它包含了一个例子,所以我没有完全复制你。但你到底为什么建议只用于序列类型?你可以用它做任何你想要的。甚至不需要做任何切片。我认为你应该给出一个你想要的例子声明(存储一个切片对象以供以后使用)。我添加了一个答案,我相信它能澄清问题。@JonClements使用
slice
函数修复了答案它实际上是一个类,返回一个切片对象。请参阅下面我的完整答案。编辑了我的答案以避免调用
slice
函数。