Разбиране на нотацията за парчета
Имам нужда от добро обяснение (препратките са предимство) на Python'slice notation.
Според мен тази нотация се нуждае от малко усвояване.
Изглежда изключително мощна, но аз не съм се ориентирал в нея.
2992
3
Всъщност е много просто:
Съществува и стойността
step
, която може да се използва с всяка от горните стойности:Ключовият момент, който трябва да запомните, е, че стойността
:stop
представлява първата стойност, която не е в избрания отрязък. Така че, разликата междуstop
иstart
е броят на избраните елементи (акоstep
е 1, по подразбиране).Другата особеност е, че
start
илиstop
може да бъде отрицателно число, което означава, че се брои от края на масива вместо от началото. Така:По същия начин
стъпка
може да бъде отрицателно число:Python е благосклонен към програмиста, ако има по-малко елементи, отколкото сте поискали. Например, ако поискате
a[:-2]
, аa
съдържа само един елемент, вместо грешка ще получите празен списък. Понякога бихте предпочели грешката, така че трябва да сте наясно, че това може да се случи.Връзка с обекта
slice()
Операторът за нарязване
[]
всъщност се използва в горния код с обектslice()
, като се използва нотацията:
(която е валидна само в рамките на[]
), т.е.:е еквивалентно на:
Обектите Slice също се държат малко по-различно в зависимост от броя на аргументите, подобно на
range()
, т.е. поддържат се кактоslice(stop)
, така иslice(start, stop[, step])
. За да се пропусне посочването на даден аргумент, може да се използваNone
, така че напримерa[start:]
е еквивалентно наa[slice(start, None)]
илиa[::-1]
е еквивалентно наa[slice(None, None, -1)]
.Макар че записът, базиран на
:
, е много полезен за просто нарязване, изричното използване на обектитеslice()
опростява програмното генериране на нарязването.В Python tutorial се говори за това (превъртете малко надолу, докато стигнете до частта за нарязването).
Схемата на ASCII изкуството също е полезна за запомняне на начина на работа с резени:
Изброяване на възможностите, разрешени от граматиката:
Разбира се, ако
(high-low)%stride != 0
, тогава крайната точка ще бъде малко по-ниска отhigh-1
.Ако
stride
е отрицателен, подредбата се променя малко, тъй като отброяваме надолу:Разширеното нарязване (със запетаи и елипси) се използва предимно само от специални структури от данни (като NumPy); основните последователности не ги поддържат.