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

For*_*Bru 25 python slice python-2.7 python-3.x

首先,我想澄清一个问题:它是关于slice()函数,而不是列表或字符串之类的a[5:4:3].

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

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

enr*_*cis 27

a[x:y:z]给出了相同的结果a[slice(x, y, z)].一个的的优点slice对象是,它可以被存储并且稍后作为单个对象而不是存储检索x,y,z.

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

  • @ForceBru:通常在编程中,用途只受你的创造力的限制;) (7认同)
  • 很少需要自己创建一个`slice`对象.您将使用`slice`对象的最常见情况是,当您编写自己的序列类型并希望支持对其包含的项进行切片时.每当其他代码在您的类的实例上使用切片表示法时,Python将使用`slice`对象调用您的`__getitem__`方法.(旧版本的Python使用了`__getslice__`方法而不是这种方法,但是自2.6以来就已经弃用了它,并且在Python 3中完全支持它.) (3认同)

Ruf*_*sVS 10

(使用函数语义)调用slice该类会实例化一个slice对象 (start,stop,step),您可以稍后在程序中将其用作切片说明符:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

如果您有一个经常使用的切片,这比在多个程序区域中使用常量更可取,并且省去了每次必须输入 2 或 3 个引用的痛苦。

当然,它确实使它看起来像一个索引,但是在使用 Python 一段时间后,您会发现一切都不是乍一看的样子,因此我建议更好地命名您的变量(就像我对reversing_slice, 而odds不是'这么清楚。


Dal*_*len 5

不,还不是全部!

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

slice()实例的第二种用法是在创建自己的对象时,将参数传递给getitem()和getslice()方法,这些对象的行为类似于字符串,列表和其他支持切片的对象。

当您这样做时:

print "blahblah"[3:5]
Run Code Online (Sandbox Code Playgroud)

这将自动转换为:

print "blahblah".__getitem__(slice(3, 5, None))
Run Code Online (Sandbox Code Playgroud)

因此,当您编写自己的索引和切片对象时:

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
Run Code Online (Sandbox Code Playgroud)

试试吧:

>>> 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"]
Run Code Online (Sandbox Code Playgroud)

较旧的Python版本支持使用方法getslice()代替getitem()。最好检查一下getitem()是否有切片,如果有,将其重定向到getslice()方法。这样,您将具有完全的向后兼容性。

这是numpy使用slice()对象进行矩阵操作的方式,很明显,它经常在各个地方间接使用。

  • 编辑我的答案以避免调用“slice”函数。 (2认同)