Altro
Comprendere la notazione delle fette
Ho bisogno di una buona spiegazione (i riferimenti sono un plus) sulla notazione slice di Python.
Per me, questa notazione ha bisogno di un po' di ripasso.
Sembra estremamente potente, ma non ho ancora capito bene come funziona.
2992
3
È piuttosto semplice:
C'è anche il valore
step
, che può essere usato con qualsiasi dei precedenti:Il punto chiave da ricordare è che il valore
:stop
rappresenta il primo valore che non è nella fetta selezionata. Quindi, la differenza trastop
estart
è il numero di elementi selezionati (sestep
è 1, il default).L'altra caratteristica è che
start
ostop
può essere un numero negativo, il che significa che conta dalla fine dell'array invece che dall'inizio. Quindi:Allo stesso modo,
step
può essere un numero negativo:Python è gentile con il programmatore se ci sono meno elementi di quelli richiesti. Per esempio, se chiedete
a[:-2]
ea
contiene solo un elemento, otterrete una lista vuota invece di un errore. A volte preferiresti l'errore, quindi devi essere consapevole che questo può accadere.Relazione con l'oggetto
slice()
L'operatore di affettamento
[]
è in realtà usato nel codice precedente con un oggettoslice()
usando la notazione:
(che è valida solo all'interno di[]
), cioè:è equivalente a:
Gli oggetti Slice si comportano anche in modo leggermente diverso a seconda del numero di argomenti, in modo simile a
range()
, cioè sono supportati siaslice(stop)
cheslice(start, stop[, step])
. Per evitare di specificare un dato argomento, si potrebbe usareNone
, in modo che, ad esempio,a[start:]
sia equivalente aa[slice(start, None)]
oa[::-1]
sia equivalente aa[slice(None, None, -1)]
.Mentre la notazione basata su
:
è molto utile per il semplice slicing, l'uso esplicito degli oggettislice()
semplifica la generazione programmatica dello slicing.Il tutorial Python ne parla (scorrete un po' più in basso fino ad arrivare alla parte sullo slicing).
Anche il diagramma ASCII art è utile per ricordare come funzionano le fette:
Un modo per ricordare come funzionano gli slices è pensare agli indici come se puntassero tra i caratteri, con il bordo sinistro del primo carattere numerato 0. Quindi il bordo destro dell'ultimo carattere di una stringa di n caratteri ha indice n.
Enumerare le possibilità permesse dalla grammatica:
Naturalmente, se
(high-low)%stride != 0
, allora il punto finale sarà un po' più basso dihigh-1
.Se
stride
è negativo, l'ordinamento è cambiato un po', dato che stiamo contando alla rovescia:Gli affettamenti estesi (con virgole ed ellissi) sono per lo più utilizzati solo da strutture dati speciali (come NumPy); le sequenze di base non li supportano.