Mais
Compreender a notação da fatia
Eu preciso de uma boa explicação (as referências são uma vantagem) na notação de fatias Python's.
Para mim, esta notação precisa de um pouco de captação.
Parece extremamente poderoso, mas eu tenho'não tenho bem a minha cabeça à volta disso.
2992
3
É muito simples, na verdade:
Há também o valor do "passo", que pode ser utilizado com qualquer uma das opções acima:
O ponto chave a lembrar é que o valor
:stop' representa o primeiro valor que é *não* na fatia selecionada. Portanto, a diferença entre
stope
starté o número de elementos selecionados (se
step` for 1, o padrão).A outra característica é que
start
oustop
pode ser um número negativo, o que significa que conta a partir do fim do array ao invés do início. Então:Da mesma forma,
step
pode ser um número negativo:Python é gentil para o programador se houver menos itens do que você pede. Por exemplo, se você pedir
a[:-2]
e `a' contém apenas um elemento, você recebe uma lista vazia ao invés de um erro. Algumas vezes você prefere o erro, então você tem que estar ciente de que isso pode acontecer.Relação com
slice()
objetoO operador de fatiamento
[]
está sendo utilizado no código acima com um objetoslice()
utilizando a notação:
(que só é válida dentro de[]
), ou seja:é equivalente a:
Os objetos da fatia também se comportam de forma ligeiramente diferente dependendo do número de argumentos, de forma similar a
range()
, ou seja, ambosslice(stop)
eslice(start, stop[, step])
são suportados. Para pular a especificação de um dado argumento, pode-se utilizarNone
, de modo que por exemploa[start:]
seja equivalente aa[slice(start, None)]
oua[::-1]
seja equivalente aa[slice(None, None, -1)]
.Enquanto a notação
:
based notation é muito útil para fatias simples, a utilização explícita de objetosslice()
simplifica a geração programática de fatias.O Python tutorial fala sobre isso (desça um pouco até chegar à parte sobre fatiar).
O diagrama de arte ASCII também é útil para lembrar como funcionam as fatias:
Enumerando as possibilidades permitidas pela gramática:
Claro, se
(high-low)%stride != 0
, então o ponto final será um pouco mais baixo quehigh-1
.Se o "stride" for negativo, o pedido é alterado um pouco, já que estamos em contagem regressiva:
Os cortes estendidos (com vírgulas e elipses) são usados principalmente apenas por estruturas de dados especiais (como o NumPy); as sequências básicas não as suportam.