Sayı Üretmek İçin Bir Araç
range() tam olarak bir işi yapar: bir tamsayı dizisi üretir. Belirli bir sayıda iterasyon yapman ya da sayısal bir aralıkta dolaşman gerektiğinde for döngülerinin vazgeçilmez ortağıdır.
En basit hali tek bir argüman alır — stop değeri:
Çıktı:
0
1
2
3
4
Yeni başlayanları yakalayan iki detay:
- Sayma 0'dan başlar.
range(5)sana 0'dan başlayan beş sayı verir. - Stop değeri dışlayıcıdır.
range(5), 5'ten önce durur — 5'in kendisini dahil etmez.
Bu kurallar Python'un dilimleme (slicing), indeksleme ve range işlemlerinde tutarlıdır. "Stop dışlayıcıdır" fikrini bir kez içselleştirdiğinde seni tökezletmez olur.
Üç Biçim
range() bir, iki veya üç argüman alır:
Step, her sıçramanın boyudur. range(0, 20, 4) her dördüncü sayıyı üretir. Bir dahaki "iki atlamalı öğe" ya da "onuncu örnek" ihtiyacında bunu aklında tut.
Geri Sayım
Adım negatif olabilir, bu da geriye doğru sayma imkânı verir:
Yine, stop dışlayıcıdır — range(10, 0, -1), 0'dan önce durur, 0'da değil. 0'ı dahil etmek için stop'u -1 yap:
range Lazy'dir
Python 3'te range(), bellekte bir sayı listesi oluşturmaz. İstek üzerine sayıları tek tek üreten hafif bir range nesnesi döndürür. Bu yüzden şunu yazabilirsin:
Milyarlık bir "range" neredeyse hiç bellek kullanmaz. Sayılar, döngü onları istedikçe üretilir.
Gerçekten sayıların bir listesine ihtiyacın varsa — çünkü onu değiştirmek, sıralamak ya da temel ötesinde indekslemek istiyorsan — açıkça dönüştür:
Çoğu zaman listeye ihtiyacın olmaz. for i in range(...) doğrudan çalışır.
Sık Kullanılan Kalıplar
Sürekli başvuracağın birkaç tarif:
Bir şeyi n kez yap.
_, "bu değeri umursamıyorum" anlamına gelen bir gelenektir — Python zorla uygulatmaz ama herhangi bir okuyucu niyeti hemen anlar.
Bir diziye indeksle gir.
range(len(...)) yerine enumerate() tercih et; ama özellikle sadece index'e ihtiyacın varsa:
Yine de çoğu zaman enumerate(items) daha temizdir.
Her ikinci elemanı dolaş.
Bu a, c, e yazdırır. Basit dilimleme için dilimleme söz dizimi daha da doğrudandır: items[::2].
Hızlıca sayısal bir liste üret.
Bu bir list comprehension — ileride işlenecek — ama sayıları sağlayan range.
range() Ne Değildir
Bilmeye değer iki keskin köşe:
rangeyalnızca tamsayı üretir. Kayan noktalı adımlara ihtiyacın varsa (örneğin 0.0'dan 1.0'a 0.1 artışlarla)numpy.arangeya da kendi sayacını kullanan bir döngü kullan.rangerastgele iterable'larla çalışmaz. Özellikle tamsayılar içindir. Bir liste üzerinde "range" yapmaya çalışıyorsan muhtemelenenumerateya da doğrudan listenin kendisini arıyorsundur.
Bir Araya Getirelim
Birden fazla varyasyonu kullanan küçük bir örnek:
İç içe iki range tabanlı döngü, bir ızgara üretiyor. Her iki döngünün de 1'den başladığına dikkat et — range(1, 6) — çünkü 1'den 5'e kadar etiketler istiyoruz.
Koleksiyonlara Geçiş
Artık koşulları, iki tür döngüyü ve range'i gördün. Bu, herhangi bir koleksiyonu sürmek için yeterli kontrol akışı. Sonraki bölüm: koleksiyonların kendisi — listeler, tuple'lar, set'ler ve sözlükler.
Sıkça Sorulan Sorular
Python'da range() ne yapar?
range() bir tamsayı dizisi üretir. range(n) 0'dan n-1'e kadar verir. range(start, stop) start'tan stop'a kadar (stop dahil değil) tamsayılar verir. range(start, stop, step) adım boyunu seçmene izin verir; geri saymak için negatif adımlar dahil.
range() bir liste mi oluşturur?
Hayır. Python 3'te range() istek üzerine sayı üreten hafif bir range nesnesi döndürür. Bu yüzden range(10**9) anındadır — aslında milyarlarca tamsayı tahsis etmez. Gerçekten bir listeye ihtiyacın varsa list(...) ile sar.
Python'da range() ile nasıl geri sayarım?
Negatif adım kullan: range(10, 0, -1) 10, 9, 8, ..., 1 sayar. stop değerinin her zaman dışlayıcı olduğunu unutma; 0'ı dahil etmek için range(10, -1, -1) gerekir.