Python 中的 slice() 函数有什么作用?

What does the slice() function do in Python?

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

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

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

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

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

从你的问题来看,我相信你正在寻找一个例子。所以这就是我尝试 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]

不,这还不是全部!

由于已经提到了对象,首先您必须知道 slice 是一个 class,不是一个返回对象的函数

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 class 实例化一个 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一段时间后,你会发现一切都不是乍一看的样子,所以我建议更好地命名你的变量(正如我对 reversing_slice 所做的那样,与 odds 相比,这还不是很清楚。