Что делает функция slice() в Python?

Прежде всего, я хотел бы уточнить вопрос: это о функции slice(), а не фрагменты списков или строк, например a[5:4:3].

В документах упоминается, что эта функция используется в NumPy и не дает примеров использования (она говорила, как ее использовать, но она не говорила, когда ее использовать). Более того, я никогда не видел эту функцию, используемую в любой программе Python.

Когда следует использовать функцию slice() при программировании на простом Python (без NumPy или SciPy)? Любые примеры будут оценены.

Ответ 1

a[x:y:z] дает тот же результат, что a[slice(x, y, z)]. Одним из преимуществ объекта slice является то, что он может быть сохранен и извлечен позже как один объект вместо хранения x, y и z.

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

Ответ 2

Нет, это не все!

Поскольку объекты уже упомянуты, сначала вы должны знать, что срез - это класс, а не функция, возвращающая объект.

Второе использование экземпляра slice() предназначено для передачи аргументов методам getitem() и getlice(), когда вы создаете свой собственный объект, который ведет себя как строка, список и другие объекты, поддерживающие нарезку.

Когда вы выполните:

print "blahblah"[3:5]

Это автоматически преобразуется в:

print "blahblah".__getitem__(slice(3, 5, None))

Итак, когда вы программируете свой собственный объект индексирования и нарезки:

class example:
    def __getitem__ (self, item):
        if isinstance(item, slice):
            print "You are slicing me!"
            print "From", item.start, "to", item.stop, "with step", item.step
            return self
        if isinstance(item, tuple):
            print "You are multi-slicing me!"
            for x, y in enumerate(item):
                print "Slice #", x
                self[y]
            return self
        print "You are indexing me!\nIndex:", repr(item)
        return self

Попробуйте:

>>> example()[9:20]
>>> example()[2:3,9:19:2]
>>> example()[50]
>>> example()["String index i.e. the key!"]
>>> # You may wish to create an object that can be sliced with strings:
>>> example()["start of slice":"end of slice"]

В старых версиях Python поддерживается метод getlice(), который будет использоваться вместо getitem(). Хорошей практикой является проверка getitem(), есть ли у нас фрагмент, и если мы это сделали, перенаправите его на метод getlice(). Таким образом, у вас будет полная обратная совместимость.

Так как numpy использует объект slice() для манипуляций с матрицами, и очевидно, что он постоянно используется везде косвенно.

Ответ 3

(Используя семантику функции) Вызов класса slice создает экземпляр объекта slice (start, stop, step), который вы можете использовать в качестве спецификатора слайса позже в вашей программе:

>>> myname='Rufus'
>>> myname[::-1] # reversing idiom
'sufuR'

>>> reversing_slice=slice(None,None,-1) # reversing idiom as slice object
>>> myname[reversing_slice]
'sufuR'

>>> odds=slice(0,None,2) # another example
>>> myname[odds]
'Rfs'

Если у вас был фрагмент, который вы часто использовали, это предпочтительнее, чем использование констант в нескольких программных областях, и избавляет от необходимости сохранять 2 или 3 ссылки, которые нужно было вводить каждый раз.

Конечно, это делает его похожим на индекс, но после некоторого времени использования Python вы узнаете, что на первый взгляд все не так, как выглядит, поэтому я рекомендую называть ваши переменные лучше (как я делал с reversing_slice, по сравнению с odds которые не очень понятно

Ответ 4

Из вашего вопроса я считаю, что вы ищете пример. Итак, вот что я имею, когда я пытаюсь slice отобразить список из range(1, 20) с шагом 3

>>> x = range(1, 20)

>>> x[1:20:3]
[2, 5, 8, 11, 14, 17]

>>> x[slice(1, 20, 3)]
[2, 5, 8, 11, 14, 17]