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
对象的优点之一是它可以在以后作为单个对象存储和检索,而不是存储x
、y
和z
。
它通常用于让用户定义自己的切片,以后可以应用于数据,而无需处理许多不同的情况。
【讨论】:
好的,我明白了。所以,没有更多的情况可以使用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() 函数有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章