Jak używać składni krojenia elipsy w Pythonie?

Pojawiło się to w Hidden features of Python, ale nie widzę dobrej dokumentacji ani przykładów wyjaśniających, jak ta funkcja działa.

Author: Community, 2008-09-23

4 answers

Ellipsis, or ... nie jest ukrytą cechą, jest tylko stałą. Jest zupełnie inny niż, powiedzmy, javascript ES6, gdzie jest częścią składni języka. Żadna wbudowana Klasa ani konstrukcja języka Python nie korzysta z niej.

Więc składnia tego zależy wyłącznie od ciebie, lub kogoś innego, który ma napisany kod, aby go zrozumieć.

Numpy używa go, jak podano w dokumentacji . Kilka przykładów tutaj .

W swojej klasie, używasz go jak to:

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

Oczywiście istnieje dokumentacja Pythona i odniesienie do języka . Ale to nie jest zbyt pomocne.

 109
Author: nosklo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-07 20:28:48

Elipsa jest używana w numpy do wycinania wyższych wymiarów struktur danych.

Ma to oznaczać w tym momencie Wstaw tyle pełnych plasterków (:), aby rozszerzyć wielowymiarowy plasterek do wszystkich wymiarów .

Przykład :

>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
Macie macierz 4-wymiarową rzędu 2x2x2x2. Aby zaznaczyć wszystkie pierwsze elementy w 4. wymiarze, można użyć notacji elipsy
>>> a[..., 0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

Co jest równoważne

>>> a[:,:,:,0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

In your own implementacje, możesz zignorować umowę wspomnianą powyżej i użyć jej do tego, co uznasz za stosowne.

 253
Author: Torsten Marek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-07 20:30:09

Jest to kolejne użycie elips, które nie ma nic wspólnego z plasterkami: często używam go w komunikacji wewnątrz wątku z kolejkami, jako znaku, który sygnalizuje "zrobione"; jest tam, jest obiektem, jest singletonem, a jego nazwa oznacza" brak", a nie nadużywane None (które można umieścić w kolejce jako część normalnego przepływu danych). YMMV.

 70
Author: tzot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-02 10:03:49

Jak stwierdzono w innych odpowiedziach, może być używany do tworzenia plastrów. Przydatne, gdy nie chcesz pisać wielu pełnych notacji (:), lub gdy po prostu nie jesteś pewien, na czym polega wymiarowość manipulowanej tablicy.

To, co uważałem za ważne, aby podkreślić, a tego brakowało w innych odpowiedziach, to to, że może być używany nawet wtedy, gdy nie ma więcej wymiarów do wypełnienia.

Przykład:

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

Spowoduje to błąd:

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

To będzie praca:

a[...,0,:]
array([0, 1])
 6
Author: Mauricio Perez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-07 04:03:58