[英]Python slice objects and __getitem__
python中是否存在内容,以不同方式处理传递给__getitem_ _
参数,并自动将start:stop:step
构造转换为切片?
这是我的意思的演示
class ExampleClass(object):
def __getitem__(self, *args):
return args
def __call__(self, *args):
return args
def randomMethod(self, *args):
return args
a = ExampleClass()
#this works
print a[3:7:2, 1:11:2]
#syntax error on the first colon
print a.randomMethod(3:7:2, 1:11:2)
print a(3:7:2, 1:11:2)
#these work
print a.randomMethod(slice(3,7,2), slice(1,11,2))
print a(slice(3,7,2), slice(1,11,2))
只是解释器在[]
搜索start:stop:step
实例,并将它们slice(start, stop, step)
? 文档简单地说:
括号(下标)表示法在内部使用切片对象
这是我不能改变行为的python内部位之一吗? 是否有可能使其他函数采用切片对象使用start:stop:step
速记?*
*我已经看到了另一个问题, 可以在括号外使用python的切片表示法吗? ,但这只是使用自定义类,我可以轻松做到。 我想要的是一种只使用start:stop:step
而不必将其包装在其他任何东西中。
边注:
它也表明[...]
内的所有参数都被打包成一个tuple
,就好像它正在做[*args]
- > __getitem__(args)
。
class ExampleClass2(object):
def __getitem__(self, arg):
return arg
def __call__(self, arg):
return arg
b = ExampleClass2()
print b["argument 1", 2:4:6,3] # ('argument 1', slice(2, 4, 6), 3)
print b(slice(3,7,2), slice(1,11,2)) # TypeError: __call__() takes exactly 2 arguments (3 given)
Python语法定义何时可以使用切片运算符:
trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
subscriptlist: subscript (',' subscript)* [',']
subscript: test | [test] ':' [test] [sliceop]
sliceop: ':' [test]
test
几乎是任何表达式,但它只能在子subscriptlist
中使用切片运算符。 所以是的, 用于下标的方括号是重要的,但是用于列表的方括号不会神奇地允许你写一个切片,也不能将切片放在恰好位于下标内的任意表达式中。
如果你想要切片,当你没有订阅东西时,你必须写slice(a,b,c)
。
np.lib.index_tricks
包含几个接受this ::
inputs的'函数',例如np.mgrid
, np.r_
, np.s_
。
它们实际上是作为类的实例实现的,具有__getitem__
定义。 他们被括号“称为”。
np.s_[2::2] # slice(2, None, 2)
np.r_[-1:1:6j, [0]*3, 5, 6] # array([-1. , -0.6, -0.2, 0.2, ... 6. ])
mgrid[0:5,0:5]
我通常不会使用它们,但它们是如何利用__getitem__
一个有趣例子。
np.insert
是一个生成包含切片的索引元组的函数示例。 np.apply_along
还:
i = zeros(nd, 'O')
...
i[axis] = slice(None, None)
...
i.put(indlist, ind)
...arr[tuple(i.tolist())]
http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html有相关说明:
请记住,切片元组总是可以构造为
obj
并在x[obj]
表示法中使用。 可以在构造中使用切片对象代替[start:stop:step]
表示法。 例如,x[1:10:5,::-1]
也可以实现为obj = (slice(1,10,5), slice(None,None,-1)); x[obj]
obj = (slice(1,10,5), slice(None,None,-1)); x[obj]
。 这对于构造适用于任意维数组的通用代码非常有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.