Forstå skivenotasjon
Jeg trenger en god forklaring (referanser er et pluss) på Pythons slice-notasjon.
For meg trenger denne notasjonen litt å plukke opp.
Det ser ekstremt kraftig ut, men jeg har ikke helt fått hodet rundt det.
2992
3
Det er egentlig ganske enkelt:
Det er også
step
-verdien, som kan brukes med hvilken som helst av de ovennevnte:Det viktigste å huske er at
:stop
-verdien representerer den første verdien som ikke er i det valgte utsnittet. Forskjellen mellomstop
ogstart
er altså antall elementer som er valgt (hvisstep
er 1, som er standard).Den andre funksjonen er at
start
ellerstop
kan være et negativt tall, noe som betyr at det teller fra slutten av matrisen i stedet for begynnelsen. Det vil si at man teller fra slutten av arrayet i stedet for begynnelsen:På samme måte kan
step
være et negativt tall:Python er snill mot programmereren hvis det er færre elementer enn du ber om. Hvis du for eksempel ber om
a[:-2]
oga
bare inneholder ett element, får du en tom liste i stedet for en feil. Noen ganger foretrekker du feilen, så du må være klar over at dette kan skje.Relasjon til
slice()
-objektet ### Relasjon tilslice()
-objektetSlicing-operatoren
[]
blir faktisk brukt i koden ovenfor med etslice()
-objekt som bruker:
-notasjonen (som bare er gyldig innenfor[]
), dvs:er ekvivalent med:
Slice-objekter oppfører seg også litt forskjellig avhengig av antall argumenter, på samme måte som
range()
, dvs. bådeslice(stop)
ogslice(start, stop[, step])
støttes. For å hoppe over å spesifisere et gitt argument kan man brukeNone
, slik at f.eks.a[start:]
er ekvivalent meda[slice(start, None)]
ellera[::-1]
er ekvivalent meda[slice(None, None, -1)]
.Selv om den
:
-baserte notasjonen er svært nyttig for enkel slicing, forenkler eksplisitt bruk avslice()
-objekter den programmatiske genereringen av slicing.Python-opplæringen]1 snakker om det (bla litt nedover til du kommer til delen om slicing).
ASCII-kunstdiagrammet er også nyttig for å huske hvordan skiver fungerer:
Oppregning av mulighetene som grammatikken tillater:
Selvfølgelig, hvis
(high-low)%stride != 0
, vil sluttpunktet være litt lavere ennhigh-1
.Hvis
stride
er negativ, endres rekkefølgen litt siden vi teller ned:Utvidet slicing (med komma og ellipser) brukes for det meste bare av spesielle datastrukturer (som NumPy); de grunnleggende sekvensene støtter dem ikke.