for, range() ve döngü problem kalıpları
Geçen hafta while ile koşul doğru olduğu sürece tekrar yaptık. Bazen ise kaç tekrar yapacağımız baştan bellidir: 1’den 10’a kadar sayıları işlemek, 7 günlük veri girmek veya 6 taksitlik bir ödeme planı oluşturmak gibi.
Bu tür durumlarda Python’ın for döngüsü ve range() fonksiyonu daha doğrudan bir anlatım sağlar. Bu hafta yalnızca yeni bir döngü sözdizimi öğrenmeyeceğiz; sayma, biriktirme, arama ve özetleme gibi tekrar eden problem kalıplarını tanıyacağız.
Bu hafta neleri yapabilmelisiniz?
Bölümün sonunda:
fordöngüsününrange()ile nasıl çalıştığını açıklayabilmeli,range(son),range(baslangic, son)verange(baslangic, son, adim)biçimlerini kullanabilmeli,- bitiş değerinin
range()tarafından dahil edilmediğini hesaba katabilmeli, - sayaç ve biriktirici kullanan basit döngüler yazabilmeli,
- belirli bir koşulu sağlayan değerleri sayabilmeli,
- bir aralıkta ilk uygun değeri bulmak için
breakkullanabilmeli, - gerektiğinde bir yinelemeyi atlamak için
continuekullanabilmeli, - özel bir bitirme değeriyle (
sentinel)whiledöngüsünü sonlandırabilmeli, - basit bir tekrar problemini uygun döngü yapısını seçerek çözebilmelisiniz.
for ile belirli sayıda tekrar
Aşağıdaki program 0, 1, 2, 3 ve 4 değerlerini yazdırır:
for sayi in range(5):
print(sayi)range(5) şu değerleri üretir:
0, 1, 2, 3, 4
Bitiş değeri olan 5 dahil değildir.
Bu davranış başta alışılmadık gelebilir; ancak aralıkların uzunluğunu hesaplamayı kolaylaştırır. range(5) tam olarak beş değer üretir.
Tahmin et — range() hangi değerleri üretir?
Aşağıdaki kodu çalıştırmadan önce çıktıyı tahmin edin:
range(2, 9, 2):
2değerinden başlar,- her adımda
2artırır, 9değerine gelmeden durur.
Bu nedenle çıktı 2, 4, 6, 8 olur.
range() biçimleri
Üç temel kullanım biçimi vardır:
| Yazım | Üretilen değerlerin fikri |
|---|---|
range(5) |
0’dan başla, 5 hariç ilerle |
range(2, 6) |
2’den başla, 6 hariç ilerle |
range(10, 0, -2) |
10’dan başla, 0 hariç ikişer azal |
Örnek:
for sayi in range(5, 0, -1):
print(sayi)Çıktı:
5
4
3
2
1
Alıştırma — son değeri dahil edin
Amaç 1’den 10’a kadar on sayının tamamını yazdırmaktır. Mevcut kod 10 değerini atlıyor.
range() bitiş değerini düzeltin.
range(1, 11) ifadesini deneyin.
for sayi in range(1, 11):
print(sayi)Sayaç ile biriktirici aynı şey değildir
Döngülerde iki değişken rolü sık görülür:
- sayaç: kaç kez işlem yapıldığını veya hangi adımda olduğumuzu izler,
- biriktirici: toplam, çarpım veya başka bir birikimli sonucu taşır.
Örneğin 1’den 5’e kadar sayıların toplamı:
toplam = 0
for sayi in range(1, 6):
toplam = toplam + sayi
print(toplam)Burada sayi, range() tarafından sırayla verilen değer; toplam ise biriktiricidir.
İzleme:
sayi |
Yeni toplam |
|---|---|
| 1 | 1 |
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |
| 5 | 15 |

range(1, 6) ile üretilen değerlerin for döngüsünde biriktiriciye eklenerek 15 toplamına ulaşmasını gösteren izleme şeması.Alıştırma — haftalık çalışma süresini toplayın
Bir öğrencinin her gün sabit 45 dakika çalıştığını ve bunu 7 gün sürdürdüğünü varsayalım. Toplam çalışma süresini biriktiriciyle hesaplayın.
toplam_dakika = toplam_dakika + 45 satırı her yinelemede çalışmalıdır.
toplam_dakika = 0
for gun in range(1, 8):
toplam_dakika = toplam_dakika + 45
print("Toplam dakika:", toplam_dakika)Sayma kalıbı
Bazen değerlerin toplamını değil, bir koşulu kaç değerin sağladığını bulmak isteriz.
Örneğin 1–20 arasında 3 ile tam bölünen kaç sayı olduğunu bulalım:
adet = 0
for sayi in range(1, 21):
if sayi % 3 == 0:
adet = adet + 1
print(adet)Buradaki sayaç her döngüde değil, yalnızca koşul doğru olduğunda artar.
Tahmin et ve çalıştır
Aşağıdaki kod 1–15 arasında çift sayıların kaç tane olduğunu sayıyor. Çalıştırmadan önce sonucu tahmin edin:
Sonuç 7 olmalıdır: 2, 4, 6, 8, 10, 12, 14.
Arama kalıbı ve break
Bir aralıkta aradığımız ilk değeri bulduğumuzda döngünün geri kalanına ihtiyacımız olmayabilir. break, içinde bulunduğu döngüyü hemen sonlandırır.
Örneğin 50’den büyük ve 7 ile tam bölünen ilk sayıyı bulalım:
for sayi in range(51, 100):
if sayi % 7 == 0:
print("Bulundu:", sayi)
breakİlk uygun değer 56 olduğunda döngü sona erer.
break, “döngünün normal koşulu bitti” anlamına gelmez; programcı döngüyü o noktada bilinçli olarak sonlandırır. Gereksiz break kullanmak kodun akışını zorlaştırabilir. Aranan sonuç bulunduğunda kalan yinelemelerin anlamı yoksa kullanmak uygundur.
Alıştırma — ilk uygun katı bulun
30’dan büyük, 8 ile tam bölünen ilk sayıyı bulun. Mevcut program tüm uygun değerleri yazdırıyor; yalnızca ilkini yazdıracak biçimde değiştirin.
print() satırından sonra aynı girinti düzeyinde break yazın.
for sayi in range(31, 80):
if sayi % 8 == 0:
print("Bulundu:", sayi)
breakcontinue: bu yinelemenin kalanını atla
continue, döngüyü tamamen bitirmez. Yalnızca o anki yinelemenin geri kalanını atlayıp bir sonraki yinelemeye geçer.
Örneğin bakım yapılan 3. saati rapora dahil etmeyelim:
for saat in range(1, 6):
if saat == 3:
continue
print("Ölçüm saati:", saat)Çıktıda 3 görünmez; fakat 4 ve 5 işlenmeye devam eder.
continue kullanmadan aynı davranış çoğu zaman if ile de yazılabilir. Bu nedenle yalnızca kodu gerçekten sadeleştiriyorsa tercih edin.
Özel bitirme değeri (sentinel)
Kaç veri geleceği baştan belli değilse for range(...) uygun olmayabilir. Kullanıcının özel bir değer girerek işlemi bitirdiği durumlarda geçen haftaki while yapısını kullanabiliriz.
Örneğin harcama tutarları girilsin; -1 girildiğinde giriş bitsin:
toplam = 0
tutar = float(input("Tutar (-1 bitirir): "))
while tutar != -1:
toplam = toplam + tutar
tutar = float(input("Tutar (-1 bitirir): "))
print("Toplam:", toplam)Burada -1 normal bir harcama değildir; yalnızca girişin bittiğini bildiren özel bitirme değeri (sentinel) olarak kullanılır.
Gerçek uygulamada geçerli harcama aralığı ayrıca doğrulanmalıdır. Bu örnekte -1 dışında negatif değer girilmediğini varsayıyoruz.
Hangi döngüyü seçmeliyim?
Basit bir başlangıç kuralı:
| Durum | Genellikle uygun yapı |
|---|---|
| Tekrar sayısı baştan belli | for + range() |
| Bir koşul sağlandığı sürece devam | while |
| Özel bitirme değeri gelene kadar devam | while |
| Belirli sayı aralığındaki değerleri işle | for + range() |
Bu bir yasak listesi değildir. Aynı problem bazen iki yapıyla da çözülebilir. Ama kodun niyetini en açık anlatan yapıyı seçmek önemlidir.
Değiştir — taksit planını inceleyin
Bir ürün 12000 TL ve 6 eşit taksitle ödenecek olsun:
Şunları deneyin:
taksit_sayisideğerini4yapın.- İlk ve son ayın
aydeğerini tahmin edin. range(1, taksit_sayisi)yazarsanız son taksitte ne olur?- Her ayın başındaki ve sonundaki
kalandeğerini küçük bir izleme tablosuna yazın.
Üret — aylık abonelik borcunu azaltın
Bir cihaz 9000 TL borçla alınmış ve her ay 1500 TL ödeme yapılacak. 6 ay boyunca ödeme sonrasındaki kalan borcu yazdıran bir program yazın.
Başlangıç kodu:
Kabul kriterleri:
forverange()kullanılmalı,- aylar
1’den6’ya kadar işlenmeli, - her ay
kalan_borcdeğerindenaylik_odemeçıkarılmalı, - ay numarası ve kalan borç yazdırılmalı,
- son ay sonunda kalan borç
0olmalı.
for ay in range(1, 7): ile başlayabilirsiniz.
kalan_borc = 9000
aylik_odeme = 1500
for ay in range(1, 7):
kalan_borc = kalan_borc - aylik_odeme
print("Ay:", ay, "Kalan borç:", kalan_borc)İç içe döngü ne zaman gerekir?
Bir tekrarın içinde başka bir tekrar gerektiğinde döngüler iç içe olabilir. Başlangıç düzeyinde bunu yalnızca problem gerçekten iki boyutlu tekrar gerektiriyorsa kullanacağız.
Örneğin iki katlı ve her katta üç odalı bir binanın oda etiketlerini üretelim:
for kat in range(1, 3):
for oda in range(1, 4):
print("Kat:", kat, "Oda:", oda)Dış döngünün her bir yinelemesinde iç döngü baştan sona çalışır. Toplam 2 × 3 = 6 satır üretilir.
Bu hafta karmaşık desen çıktıları üretmeyeceğiz; önemli olan “iki bağımsız tekrar boyutu varsa iç içe döngü gerekebilir” fikridir.
Bölüm özeti
Bu hafta belirli sayıda tekrarı for ve range() ile ifade ettik ve sık kullanılan döngü kalıplarını gördük.
range()bitiş değerini dahil etmez.range(baslangic, son, adim)ile başlangıç ve ilerleme miktarı belirlenebilir.- Sayaç kaç olay olduğunu; biriktirici toplam gibi biriken sonucu tutar.
- Koşulu sağlayan değerleri saymak için sayaç yalnızca
ifdoğru olduğunda artırılabilir. breakaranan sonuç bulunduğunda döngüyü tamamen bitirebilir.continueyalnızca mevcut yinelemenin kalanını atlar.- Tekrar sayısı baştan biliniyorsa
for, koşula bağlı belirsiz tekrar içinwhileçoğu zaman daha açıklayıcıdır. - Özel bitirme değeri (
sentinel) veri girişinin sona erdiğini bildirmek için kullanılabilir. - İç içe döngü, problemde gerçekten iki tekrar boyutu olduğunda kullanılmalıdır.
Kendinizi kontrol edin
Kodu çalıştırmadan cevaplamaya çalışın:
range(1, 5)hangi değerleri üretir?range(2, 11, 2)hangi değerleri üretir?1–100arasındaki sayıların toplamını tutan değişken sayaç mı, biriktirici mi olur?breakilecontinuearasındaki temel fark nedir?range(1, 7)neden altı ayı temsil eder?- Özel bitirme değeri (
sentinel) hangi tür veri girişlerinde yararlıdır? - İki kat ve dört oda için iç içe döngü toplam kaç yineleme yapar?
Bir sonraki bölümde tekrar eden kod parçalarını fonksiyonlara ayıracak; parametreler ve dönüş değerleriyle problemi daha küçük parçalara böleceğiz.