Как вы используете синтаксис многоточия в Python? [дубликат]

этот вопрос уже есть ответ здесь:

Это скрытые возможности Python, но я не вижу хорошей документации или примеров, объясняющих, как работает эта функция.

4 ответов


вы бы использовали его в своем собственном классе, так как никакой встроенный класс не использует его.

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 и справочник по языку. Но это не очень помогает.


многоточие используется для среза многомерных структур данных.

Он предназначен, чтобы означать в этот момент вставьте столько полных срезов (:), чтобы расширить многомерный срез на все размеры.

пример:

>>> 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])

в ваших собственных реализациях вы можете игнорировать контракт, упомянутый выше, и использовать его для того, что вы считаете нужным.


Это еще с многоточием, которая не имеет ничего общего с ломтиками: я часто использую его в интра-нить связи с очередями, как знак, что сигнал "готово"; то есть, это объект, это синглтон, и его имя означает "отсутствие", и это не злоупотреблять ничего (которую можно поставить в очередь как часть нормального потока данных). YMMV.


как указано в других ответах, его можно использовать для создания срезов. Полезно, когда вы не хотите писать много полных срезов обозначений (:), или когда вы просто не уверены в том, что является размерностью манипулируемого массива.

то, что я считал важным подчеркнуть, и что отсутствовало в других ответах, заключается в том, что его можно использовать, даже когда нет больше измерений для заполнения.

пример:

>>> from numpy import arange
>>> a = arange(4).reshape(2,2)

это приведет к ошибка:

>>> a[:,0,:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array

это будет работать:

a[...,0,:]
array([0, 1])