Dilim gösterimini anlama
Python'un dilim gösterimi hakkında iyi bir açıklamaya ihtiyacım var (referanslar bir artıdır).
Bana göre bu notasyonun biraz toparlanması gerekiyor.
Son derece güçlü görünüyor, ancak kafamda tam olarak oturtamadım.
2992
3
Aslında oldukça basit:
Yukarıdakilerden herhangi biriyle birlikte kullanılabilen
step
değeri de vardır:Hatırlanması gereken kilit nokta,
:stop
değerinin seçilen dilimde olmayan ilk değeri temsil ettiğidir. Dolayısıyla,stop
vestart
arasındaki fark seçilen öğe sayısıdır (eğerstep
varsayılan olarak 1 ise).Diğer bir özellik ise
start
veyastop
negatif bir sayı olabilir, yani dizinin başı yerine sonundan itibaren sayar. Yani:Benzer şekilde,
step
negatif bir sayı olabilir:Python, istediğinizden daha az öğe varsa programcıya karşı naziktir. Örneğin,
a[:-2]
isterseniz vea
sadece bir eleman içeriyorsa, hata yerine boş bir liste alırsınız. Bazen hatayı tercih edersiniz, bu yüzden bunun olabileceğinin farkında olmalısınız.slice()
nesnesi ile ilişkiDilimleme operatörü
[]
aslında yukarıdaki kodda:
notasyonu (sadece[]
içinde geçerlidir) kullanılarak birslice()
nesnesi ile kullanılmaktadır, yani:eşdeğerdir:
Slice nesneleri de
range()
a benzer şekilde argüman sayısına bağlı olarak biraz farklı davranır, yani hemslice(stop)
hem deslice(start, stop[, step])
desteklenir. Belirli bir argümanı belirtmeyi atlamak içinNone
kullanılabilir, böylece örneğina[start:]
,a[slice(start, None)]
veyaa[::-1]
,a[slice(None, None, -1)]
ile eşdeğerdir.Basit dilimleme için
:
tabanlı gösterim çok yararlı olsa da,slice()
nesnelerinin açık kullanımı dilimlemenin programatik olarak oluşturulmasını basitleştirir.Python öğreticisi]1 bundan bahsediyor (dilimleme ile ilgili kısma gelene kadar biraz aşağı kaydırın).
ASCII sanat diyagramı da dilimlerin nasıl çalıştığını hatırlamak için yararlıdır:
Dilbilgisi tarafından izin verilen olasılıkların sıralanması:
Elbette,
(yüksek-düşük)%stride != 0
ise, bitiş noktasıyüksek-1
den biraz daha düşük olacaktır.Eğer
stride
negatif ise, geri sayım yaptığımız için sıralama biraz değişir:Genişletilmiş dilimleme (virgüller ve elipsler ile) çoğunlukla sadece özel veri yapıları (NumPy gibi) tarafından kullanılır; temel diziler bunları desteklemez.