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

Posted

技术标签:

【中文标题】Python 中的 slice() 函数有啥作用?【英文标题】:What does the slice() function do in Python?Python 中的 slice() 函数有什么作用? 【发布时间】:2015-10-08 17:00:18 【问题描述】:

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

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

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

【问题讨论】:

其实是一个类,返回一个切片对象。请参阅下面的完整答案。 【参考方案1】:

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

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

【讨论】:

好的,我明白了。所以,没有更多的情况可以使用slice() @ForceBru:通常在编程中,用途仅受您的创造力限制;) 很少需要自己创建一个slice 对象。使用slice 对象的最常见情况是,当您编写自己的序列类型并希望支持对其包含的项目进行切片时。每当其他代码在您的类的实例上使用切片符号时,Python 将使用 slice 对象调用您的 __getitem__ 方法。 (旧版本的 Python 使用 __getslice__ 方法而不是这种方法,但自 2.6 以来已被弃用,并且对它的支持在 Python 3 中完全消失。) @Blckknght 是的,很好的解释。没有及时看到,所以我添加了一个答案。至少它包含一个例子,所以我没有完全复制你。但是你到底为什么建议只使用序列类型呢?你可以用它做任何你想做的事。甚至根本不需要做任何切片。 我认为你应该给出一个你所说的例子(存储一个切片对象以供以后使用)。我添加了一个我相信可以澄清它的答案。【参考方案2】:

(使用函数语义)调用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 一段时间后,你会发现一切都不是乍看之下的样子,所以我建议更好地命名你的变量(就像我对 @987654324 所做的那样@,与不太清楚的odds 相比。

【讨论】:

【参考方案3】:

不,这还不是全部!

正如已经提到的对象,首先你要知道切片是一个类,不是一个函数返回一个对象。

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 一个函数。【参考方案4】:

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

【讨论】:

@JonClements 用slice 函数解决了问题

以上是关于Python 中的 slice() 函数有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

MFC中ProcessMessage()函数有啥作用?

Python 中的lambda 是啥意思,有啥作用,如何使用?

Python中的“ @”(@)符号有啥作用?

python的关键字yield有啥作用

python中的迭代器有啥用

python中字典常用的方法都有哪些,分别有啥作用?