如何在Python中使用省略号切片语法?
这个问题出现在 Python的隐藏特性 这个讨论里,但我找不到好的文档或例子来解释这个特性是怎么工作的。
4 个回答
74
这是对省略号(Ellipsis)的另一种用法,跟切片没有关系。我经常在多线程之间用它来进行通信,特别是在队列中,作为一个“完成”的标记。它是一个对象,属于单例模式,名字的意思是“缺少”,而不是常用的None(None可以作为正常数据流的一部分放入队列)。你的情况可能会有所不同。
308
省略号在numpy中用来切片更高维的数据结构。
它的意思是在这个位置,插入尽可能多的完整切片(:
),以扩展多维切片到所有维度。
举个例子:
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
现在,你有一个4维的矩阵,大小是2x2x2x2。要选择第4维的所有第一个元素,你可以使用省略号表示法
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
这相当于
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
在你自己的实现中,你可以忽略上面提到的规则,随意使用它。
134
Ellipsis
,也就是 ...
,并不是一个隐藏的功能,它只是一个常量。它和 JavaScript 的 ES6 语法是完全不同的,后者是语言的一部分。Python 里没有内置的类或者语言结构会用到它。
所以,使用它的语法完全依赖于你自己,或者其他人写的代码来理解它。
Numpy 里用到了这个常量,具体可以查看它的文档。这里有一些示例可以参考。
在你自己的类里,你可以这样使用它:
>>> class TestEllipsis(object):
... def __getitem__(self, item):
... if item is Ellipsis:
... return "Returning all items"
... else:
... return "return %r items" % item
...
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items
当然,还有Python 的文档和语言参考。不过这些可能不是很有帮助。