"Нарезка" в документации на языке 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.
Ответы
Ответ 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 для получения дополнительной информации.