不,这还不是全部!
正如已经提到的对象,首先你要知道切片是一个类,不是一个函数返回一个对象。
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() 对象进行矩阵操作的方式,很明显,它在任何地方都经常间接使用。