省略号对象有什么作用?
在随意浏览命名空间的时候,我发现了一个奇怪的东西,叫做 Ellipsis
。它看起来似乎没有什么特别的功能,但它是一个全局可用的内置对象。
经过搜索,我发现它在 Numpy 和 Scipy 的某些不太常见的切片语法中被使用……但几乎没有其他用途。
这个对象是专门为了支持 Numpy 和 Scipy 而加入到语言中的吗?Ellipsis 有没有什么通用的含义或用途呢?
D:\workspace\numpy>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> Ellipsis
Ellipsis
14 个回答
在Python 3中,你可以使用省略号这个符号...
作为一个“占位符”,表示那些还没有写好的代码:
def will_do_something():
...
这不是魔法;实际上任何表达式都可以替代...
,比如:
def will_do_something():
1
(虽然不能用“被批准”这个词,但我可以说这种用法并没有被完全拒绝,这是Guido的看法。)
¹ 'can' not in {'must', 'should'}
这个内容是最近在另一个问题中提到的。我会详细解释一下我在那里的回答:
Ellipsis是一个可以出现在切片表示法中的对象。举个例子:
myList[1:2, ..., 0]
它的具体含义完全取决于实现了__getitem__
函数的对象如何处理Ellipsis
对象,但它的主要(也是预期的)用途是在numpy这个第三方库中,这个库增加了一种多维数组类型。因为有多个维度,切片操作就比单纯的开始和结束索引要复杂得多;能够在多个维度上进行切片是非常有用的。例如,给定一个4 × 4的数组,左上角的区域可以用切片[:2, :2]
来定义:
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
>>> a[:2, :2] # top left
array([[1, 2],
[5, 6]])
进一步说,Ellipsis在这里用来表示未指定的数组维度的占位符。可以把它想象成在它所在的地方表示所有维度的完整切片[:]
,所以对于一个三维数组,a[..., 0]
和a[:, :, 0]
是一样的;对于四维数组,a[:, :, :, 0]
也是类似的,a[0, ..., 0]
等同于a[0, :, :, 0]
(中间有多少个冒号就表示数组的维度数)。
有趣的是,在python3中,Ellipsis字面量(...
)可以在切片语法之外使用,所以你实际上可以写:
>>> ...
Ellipsis
编辑:Ellipsis在标准库的typing
模块中也有使用:例如,Callable[..., int]
表示一个返回int
的可调用对象,而不需要指定具体的参数;或者tuple[str, ...]
表示一个可变长度的字符串元组。