Więcej
Rozumienie notacji plasterków
Potrzebuję dobrego wyjaśnienia (referencje są plusem) na temat notacji Pythona's slice.
Dla mnie ta notacja potrzebuje trochę podnieść.
Wygląda na niezwykle potężny, ale nie całkiem mam głowę wokół niego.
2992
3
To naprawdę proste:
Istnieje również wartość
step
, która może być używana z każdym z powyższych:Kluczowym punktem do zapamiętania jest to, że wartość
:stop
reprezentuje pierwszą wartość, która nie znajduje się w wybranym wycinku. Tak więc, różnica pomiędzystop
astart
jest liczbą wybranych elementów (jeślistep
wynosi 1, domyślnie).Inną cechą jest to, że
start
lubstop
może być liczbą ujemną, co oznacza, że liczy się od końca tablicy zamiast od jej początku. A więc:Podobnie,
step
może być liczbą ujemną:Python jest łaskawy dla programisty, jeśli jest mniej elementów, niż się o nie prosi. Na przykład, jeśli poprosisz o
a[:-2]
, aa
zawiera tylko jeden element, otrzymasz pustą listę zamiast błędu. Czasami wolałbyś błąd, więc musisz być świadomy, że może się to zdarzyć.Relacja do obiektu
slice()
Operator krojenia
[]
jest w rzeczywistości używany w powyższym kodzie z obiektemslice()
używając notacji:
(która jest ważna tylko wewnątrz[]
), tzn:jest równoważne z:
Obiekty slice również zachowują się nieco inaczej w zależności od liczby argumentów, podobnie jak w przypadku
range()
, tzn. obsługiwane są zarównoslice(stop)
jak islice(start, stop[, krok])
. Aby pominąć specyfikację danego argumentu, można użyćNone
, tak więc np.a[start:]
jest równoważnea[slice(start, None)]
luba[::-1]
jest równoważnea[slice(None, None, -1)]
.Podczas gdy notacja oparta na
:
jest bardzo pomocna przy prostym krojeniu, jawne użycie obiektówslice()
upraszcza programowe generowanie krojenia.Tutorial Pythona]1 mówi o tym (przewiń trochę w dół, aż dojdziesz do części o krojeniu).
Diagram ASCII art jest również pomocny w zapamiętaniu, jak działają plasterki:
Wyliczenie możliwości, na jakie pozwala gramatyka:
Oczywiście, jeśli
(high-low)%stride != 0
, to punkt końcowy będzie nieco niżej niżhigh-1
.Jeśli
stride
jest ujemny, to kolejność jest nieco zmieniona, ponieważ odliczamy w dół:Rozszerzone krojenie (z przecinkami i elipsami) są w większości używane tylko przez specjalne struktury danych (jak NumPy); podstawowe sekwencje ich nie obsługują.