Подтвердить что ты не робот

"Нарезка" в документации на языке Python

Я не понимаю следующую часть документов Python:

http://docs.python.org/reference/expressions.html#slicings

Относится ли это к сортировке списка (x=[1,2,3,4]; x[0:2])..? В частности, части, относящиеся к эллипсису..

slice_item       ::=  expression | proper_slice | ellipsis

Преобразование элемента среза, являющегося выражением, является выражением. Преобразование элемента эллиптического среза является встроенным объектом Ellipsis.

4b9b3361

Ответ 1

Определение простого тестового класса, который просто печатает передаваемые данные:

>>> class TestGetitem(object):
...   def __getitem__(self, item):
...     print type(item), item
... 
>>> t = TestGetitem()

Пример выражения:

>>> t[1]
<type 'int'> 1
>>> t[3-2]
<type 'int'> 1
>>> t['test']
<type 'str'> test
>>> t[t]
<class '__main__.TestGetitem'> <__main__.TestGetitem object at 0xb7e9bc4c>

Пример фрагмента:

>>> t[1:2]
<type 'slice'> slice(1, 2, None)
>>> t[1:'this':t]
<type 'slice'> slice(1, 'this', <__main__.TestGetitem object at 0xb7e9bc4c>)

Пример эллипсиса:

>>> t[...]
<type 'ellipsis'> Ellipsis

Кортеж с эллипсисом и срезом:

>>> t[...,1:]
<type 'tuple'> (Ellipsis, slice(1, None, None))

Ответ 2

Ellipsis используется в основном числовой питон extension, который добавляет тип массива с несколькими вариантами. Поскольку существует более одного измерения, slicing становится более сложным, чем просто индекс начала и остановки; полезно также иметь возможность срезать в нескольких вариантах. например, учитывая массив 4x4, верхняя левая область будет определяться срезом "[: 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]])

Эллипсис используется здесь, чтобы указать местозаполнитель для остальных параметров массива, не указанных. Подумайте об этом, указав полный фрагмент [:] для размеров, не указанных, поэтому для 3d-массива a[...,0] совпадает с a[:,:,0] и для 4d, a[:,:,:,0].

Обратите внимание, что фактический литерал Ellipsis (...) не используется вне синтаксиса slice в python2, хотя есть встроенный объект Ellipsis. Это то, что подразумевается под "Преобразование элемента ломпсиса ломтика - это встроенный объект Ellipsis". то есть. "a[...]" эффективно сахара для "a[Ellipsis]". В python3, ... обозначает многоточие в любом месте, поэтому вы можете написать:

>>> ...
Ellipsis

Если вы не используете numpy, вы можете в значительной степени игнорировать все упоминания о Ellipsis. Ни один из встроенных типов не использует его, так что действительно все, о чем вам нужно заботиться, это то, что списки получают один объект среза, содержащий элементы "start", "stop" и "step". то есть:

l[start:stop:step]   # proper_slice syntax from the docs you quote.

эквивалентно вызову:

l.__getitem__(slice(start, stop, step))

Ответ 3

Что происходит, так это. См. http://docs.python.org/reference/datamodel.html#types и http://docs.python.org/library/functions.html#slice

Объекты среза используются для представления срезов, когда синтаксис расширенного среза используемый. Это фрагмент с использованием двух двоеточия или множественные ломтики или эллипсы разделенные запятыми, например, a [i: j: step], a [i: j, k: l] или [..., я: J]. Они также создаются встроенная функция slice().

Специальные атрибуты только для чтения: start is нижняя граница; остановка - верхняя связаны; шаг - это значение шага; каждый из них Нет, если не указано. Эти атрибуты могут имеют любой тип.

x=[1,2,3,4]
x[0:2]

"0: 2" преобразуется в объект Slice с началом 0, остановкой 2 и шагом None.

Этот объект Slice предоставляется методу x __getitem__ классов, которые вы определяете.

>>> class MyClass( object ):
    def __getitem__( self, key ):
        print type(key), key


>>> x=MyClass()
>>> x[0:2]
<type 'slice'> slice(0, 2, None)

Однако для класса списка встроенного класса необходимо переопределить специальный метод __getslice__.

class MyList( list ):
    def __getslice__( self, i, j=None, k=None ):
        # decode various parts of the slice values

Эллипсис представляет собой специальный синтаксис "игнорировать это измерение", предоставляемый многомерным срезам.

Также см. http://docs.python.org/library/itertools.html#itertools.islice для получения дополнительной информации.