>>> range(1,11)
sana verir
[1,2,3,4,5,6,7,8,9,10]
Neden 1-11 değil?
Sadece rastgele böyle yapmaya karar verdiler mi yoksa görmediğim bir değeri var mı?
range()
çok daha anlamlı olduğunu göreceksiniz
>>> range(1,11)
sana verir
[1,2,3,4,5,6,7,8,9,10]
Neden 1-11 değil?
Sadece rastgele böyle yapmaya karar verdiler mi yoksa görmediğim bir değeri var mı?
range()
çok daha anlamlı olduğunu göreceksiniz
Yanıtlar:
Çünkü 10 öğeye eşit range(0, 10)
olan döndürmeyi çağırmak daha yaygındır . Programcıların 0 tabanlı indekslemeyi tercih ettiğini unutmayın.[0,1,2,3,4,5,6,7,8,9]
len(range(0, 10))
Ayrıca, aşağıdaki ortak kod snippet'ini de göz önünde bulundurun:
for i in range(len(li)):
pass
Eğer görebiliyordu range()
tam olarak çıktım len(li)
bu sorunlu olacağını? Programcı açıkça Bu aynı zamanda tercih programcılar ortak bir trend izlemektedir 1. çıkarmak gerekir for(int i = 0; i < 10; i++)
üzerinde for(int i = 0; i <= 9; i++)
.
Aralığı 1 başlangıçıyla sık sık çağırıyorsanız, kendi işlevinizi tanımlamak isteyebilirsiniz:
>>> def range1(start, end):
... return range(start, end+1)
...
>>> range1(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
range(start, count)
?
range(10)
eşdeğerdir range(0, 10)
.
range1
farklı bir adım boyutuna sahip aralıkları ile çalışmaz 1
.
for i in range(len(li)):
daha ziyade bir antipattern. Biri kullanmalı enumerate
.
Burada bazı yararlı algoritmik açıklamalar olmasına rağmen, konuyu neden bu şekilde çalıştığına dair basit bir 'gerçek hayat' mantığı eklemeye yardımcı olabileceğini düşünüyorum, bu da genç yeni gelenlere konuyu tanıtırken yararlı buldum:
'Range (1,10)' gibi bir şeyle karışıklık, parametre çiftinin "başlangıç ve bitiş" i temsil ettiğini düşünmekten kaynaklanabilir.
Aslında başlangıç ve "durma" dır.
O Şimdi eğer vardı sonra "son" değerini, evet, bu sayı, dizideki son girdi olarak dahil olacağını beklenebilir. Ama bu "son" değil.
Diğerleri yanlışlıkla bu parametreyi "sayım" olarak adlandırır, çünkü yalnızca 'range (n)' kullanırsanız, elbette 'n' kez tekrarlar. Start parametresini eklediğinizde bu mantık bozulur.
Yani kilit nokta ismini hatırlamaktır: " dur ". Bu, ulaşıldığında, yinelemenin hemen duracağı noktadır. Bu noktadan sonra değil .
Dolayısıyla, "start" gerçekten dahil edilecek ilk değeri temsil etse de, "stop" değerine ulaştığında, durmadan önce "bunu da" işlemeye devam etmek yerine "kırar".
Bunu çocuklara açıklarken kullandığım bir benzetme, ironik olarak, çocuklardan daha iyi davranmasıdır! O durmuyor sonra bu gerekiyordu - o ne yaptığını bitirmeden hemen durur. (Bunu alırlar;))
Başka bir benzetme - Bir araba zaman yok geçmesi bir durdurma / verim / 'vermek yolu' işareti ve arkasında arabanızı bir yere yanında oturan ya ile bitirmek. Teknik olarak durduğunuzda hala ulaşmadınız. 'Yolculuğunuzda geçtiğiniz şeylere' dahil değildir.
Umarım bunların bazıları Pythonitos / Pythonitas'a açıklamada yardımcı olur!
Sıfır tabanlı indeksleme ve ile birlikte iyi çalışır len()
. Örneğin, listede 10 öğe varsa x
, bunlar 0-9 olarak numaralandırılır. range(len(x))
size 0-9 verir.
Tabii ki, insanlar daha fazla Pythonic yapmak olduğunu söyleyecektir for item in x
veya for index, item in enumerate(x)
ziyade for i in range(len(x))
.
Dilimleme de bu şekilde çalışır: foo[1:4]
1-3 arasındaki öğelerdir foo
(öğe 1'in sıfır tabanlı dizinleme nedeniyle aslında ikinci öğe olduğunu unutmayın). Tutarlılık için her ikisi de aynı şekilde çalışmalıdır.
Ben olarak düşünüyorum: "İlk numarası takip istediğiniz ilk sayı, yok . İstiyoruz" 1-10 istiyorsanız, ilk istemediğiniz sayı 11'dir, yani range(1, 11)
.
Belirli bir uygulamada hantal hale gelirse, bitiş dizinine ve çağrılarına 1 ekleyen küçük bir yardımcı işlev yazmak yeterince kolaydır range()
.
w = 'abc'; w[:] == w[0:len(w)]; w[:-1] == w[0:len(w)-1];
def full_range(start,stop): return range(start,stop+1) ## helper function
for index, item in enumerate(x)
karışıklığı önlemek için okumak gerekir
Ayrıca aralıkları bölmek için de yararlıdır; range(a,b)
içine bölünebilir range(a, x)
ve range(x, b)
kapsayıcı aralıkla ya x-1
ya yazabilirsiniz x+1
. Aralıkları nadiren bölmeniz gerekse de, listeleri sık sık bölme eğilimindesiniz, bu da bir listeyi dilimlemenin l[a:b]
b-th öğesini değil, a-öğesini içerir. Daha sonra range
aynı özelliğe sahip olmak onu güzel tutar.
Aralığın uzunluğu üst değer eksi alt değerdir.
Gibi bir şeye çok benzer:
for (var i = 1; i < 11; i++) {
//i goes from 1 to 10 in here
}
C tarzı bir dilde.
Ayrıca Ruby'nin menzili gibi:
1...11 #this is a range from 1 to 10
Bununla birlikte, Ruby birçok kez terminal değerini dahil etmek isteyeceğinizi kabul eder ve alternatif sözdizimini sunar:
1..10 #this is also a range from 1 to 10
1..10
vs 1...10
kod okurken ayırt etmek zor olmak!
Temel olarak python zamanlarını range(n)
yineler n
, bu da özel niteliktedir, bu yüzden yazdırılırken son değeri vermez, kapsayıcı değer veren bir işlev yaratabiliriz, bu da aralıkta belirtilen son değeri de basacağı anlamına gelir.
def main():
for i in inclusive_range(25):
print(i, sep=" ")
def inclusive_range(*args):
numargs = len(args)
if numargs == 0:
raise TypeError("you need to write at least a value")
elif numargs == 1:
stop = args[0]
start = 0
step = 1
elif numargs == 2:
(start, stop) = args
step = 1
elif numargs == 3:
(start, stop, step) = args
else:
raise TypeError("Inclusive range was expected at most 3 arguments,got {}".format(numargs))
i = start
while i <= stop:
yield i
i += step
if __name__ == "__main__":
main()
Kodu düşünün
for i in range(10):
print "You'll see this 10 times", i
Fikir, y-x
(yukarıda gördüğünüz gibi) tekrarlayabileceğiniz bir uzunluk listesi almanızdır.
Menzil için python belgelerini okuyun - döngüsel yinelemeyi birincil kullanım alanını düşünürler.
Birçok durumda mantık yürütmek daha uygundur.
Temel olarak, bir aralığı start
ve arasındaki bir aralık olarak düşünebiliriz end
. Eğer start <= end
, aralarındaki aralığın uzunluğu end - start
. Eğer len
gerçekte uzunluğu olarak tanımlandı, sen olurdu:
len(range(start, end)) == start - end
Ancak, aralığın uzunluğunu ölçmek yerine aralığa dahil edilen tam sayıları sayıyoruz. Yukarıdaki özelliği doğru tutmak için uç noktalardan birini dahil etmeli ve diğerini hariç tutmalıyız.
step
Parametre eklemek, bir uzunluk birimi eklemek gibidir. Bu durumda, beklersiniz
len(range(start, end, step)) == (start - end) / step
uzunluk için. Sayımı almak için sadece tamsayı bölmesini kullanırsınız.