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 de kaç tekrar yapacağımız baştan bellidir: 1’den 10’a kadar sayıları işlemek, 7 günlük veri girmek ya da 6 taksitlik bir ödeme planı çıkarmak gibi.

Bu tür durumları Python’da for döngüsü ve range() fonksiyonuyla daha kısa yazabiliriz. Bu hafta for söz dizimini öğrendikten sonra sayma, biriktirme, arama ve özetleme gibi birçok problemde karşımıza çıkan döngü kalıplarını tanıyacağız.

Bu sayfadaki kod hücreleri kendiliğinden çalışmaz. Her hücrede önce çıktıyı tahmin edin, sonra Run Code düğmesine basın. Kodu değiştirip yeniden çalıştırabilir, Start Over ile ilk hâline döndürebilirsiniz.

Bu bölümün kapsamı

NoteSınavda sorulur
  • range() nesnesinin ürettiği değerler ve listeden farkı
  • range() biçimleri ve bitiş değerinin dışarıda kalması
  • Sayma ve biriktirme kalıpları
  • Arama kalıbında break ile erken bitirme
  • continue ile yalnızca o yinelemeyi atlama
  • while True ve break ile geçerli girdi kalıbı ve bu kalıbın özel bitirme değerinden (sentinel) farkı
  • Probleme göre for ile while arasında seçim
  • enumerate() ve zip() kullanımı
  • İkiden çok katmanlı iç içe döngüler

Bu başlıklar konunun devamıdır. İleride karşınıza çıkar, ama bu derste ezberlemeniz beklenmiyor.

Sınav kâğıtlarını okuma işini nasıl yazardınız?

Bir dersin sınavına 30 öğrenci girdi. Kâğıtlar 1’den 30’a kadar numaralı ve bir destede sırayla duruyor. Bir asistan desteyi okuyup hocaya iki şey söyleyecek: kaç öğrencinin geçtiği (geçme sınırı 50) ve sınıfın puan ortalaması.

Asistanın yerine bir program yazılacak. Program yalnız yazdığınız adımları uygular: hangi kâğıttan başlayacağını, nerede duracağını ve her kâğıtta ne yapacağını siz söylemezseniz bilmez. 1. bölümde bir işin adımlarını sözde kodla yazmıştık. Bu işin adımlarını da öyle, Türkçe ve madde madde yazın. Sonra adımlarınızı dört durumla deneyin:

  1. Adımlarınız 30 numaralı kâğıdı da okuyor mu? Toplam kaç kâğıt okunuyor?
  2. 5 numaralı öğrenci sınava girmemiş, kâğıdı boş. Adımlarınıza göre bu kâğıt ortalamaya giriyor mu? Ortalamayı hesaplarken kaça bölüyorsunuz?
  3. Hoca başka bir gün yalnız “100 alan var mı?” diye soruyor. 3 numaralı kâğıtta 100 var. Adımlarınız bu soruyu cevaplamak için kaç kâğıt okuyor?
  4. Ertesi hafta mazeret sınavının kâğıtları geliyor. Kaç kâğıt geleceğini kimse bilmiyor. Hoca son kâğıdın arkasına üstünde “bitti” yazan bir sayfa koyuyor. Adımlarınız nerede duruyor?

Python bilmeniz gerekmiyor: “Kâğıt boşsa sonrakine geç” de bir adım. Adımlarınızı bir kenara yazın. Bölümde her birinin Python’da nasıl yazıldığını göreceğiz. Alıştırmalardan önce listenize döneceğiz.

for ile belirli sayıda tekrar

range tarafından üretilen değerlerin for döngüsüne sırayla gelmesi.

for ve range akışı

for döngüsü bir dizi değeri sırayla tek tek alır ve her değer için girintili gövdeyi bir kez çalıştırır. for sayi in range(5): satırı şunu söyler: range(5)’in verdiği her değeri sırayla sayi adına bağla ve gövdeyi çalıştır. Bu hücre hangi sayıları yazar? 5 de yazılır mı?

range(5) 0’dan başlar ve 5’e gelmeden durur. Bitiş değeri olan 5 dâhil değildir.

Bu davranış başta alışılmadık gelebilir, ama kaç değer üretileceğini hesaplamayı kolaylaştırır: range(5) beş değer, range(2, 6) ise 6 - 2 = 4 değer üretir.

range() değerleri sırası gelince verir

range(5) ile döngüde 0–4 değerlerini dolaşabiliriz, ama range() çağrısı bu değerleri bir liste olarak tutmaz. Köşeli parantez içinde virgülle sıralanan değerlere liste denir: [0, 1, 2] gibi. Listeleri 9. bölümde ayrıntılı göreceğiz.

range() bunun yerine ayrı bir range nesnesi oluşturur. Nesne (object), Python’ın bellekte tuttuğu, türü belli bir değerdir. range nesnesi değerleri döngüye sırası gelince verir. Değerleri bir kerede görmek isterseniz list() ile listeye çevirebilirsiniz. Bu hücre iki satır yazar. Satırlar aynı mı?

İlk satır range(0, 5) yazar. print() nesnenin kendisini gösterir, içindeki değerleri tek tek dökmez. İkinci satır [0, 1, 2, 3, 4] yazar, çünkü list() değerleri alıp bir liste oluşturur.

Note

for sayi in range(5): yazarken list(range(5)) yapmanız gerekmez. Döngü değerleri range nesnesinden doğrudan sırayla alır. Burada list() yalnızca aralığın içeriğini göstermek için kullanıldı.

Tahmin et: range() hangi değerleri üretir?

range()’e üç sayı verildiğinde ilki başlangıç, ikincisi bitiş, üçüncüsü adımdır: değer her turda adım kadar artar. Aşağıdaki kod hangi sayıları yazar? Çalıştırmadan önce tahmin edin.

range(2, 9, 2) 2 değerinden başlar, her adımda 2 artar ve 9 değerine gelmeden durur. Bu yüzden çıktı 2, 4, 6, 8 olur. Sıradaki değer 10 olurdu, ama 10 bitiş sınırını geçer.

range() biçimleri

range(stop), range(start, stop) ve range(start, stop, step) kullanımlarının ürettiği değerler.

range parametreleri

Üç temel kullanım biçimi vardır:

Yazım Ürettiği değerler
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’a gelmeden ikişer azal

Adım negatif olduğunda kural değişmez, 0 için de ayrı bir kural yoktur. Bitiş (stop) değeri hiçbir durumda dâhil edilmez. Değişen yalnızca ilerleme yönüdür.

Aşağıdaki hücre 5’ten geriye doğru sayıyor. Liste 0 ile biter mi?

Çıktı [5, 4, 3, 2, 1] olur. Listede 0 yok, çünkü bu çağrıda bitiş değeri 0’dır.

Başlangıcın dâhil, bitişin hariç olduğu bu tür aralığa yarı açık aralık denir. Adım pozitif olduğunda da aynı kural geçerlidir.

Alıştırma: son değeri dâhil edin

1’den 10’a kadar on sayının hepsini yazdırmak istiyoruz. Aşağıdaki kod 10 değerini atlıyor.

range() çağrısındaki bitiş değerini düzeltin.

range(1, 11) ifadesini deneyin.

for sayi in range(1, 11):
    print(sayi)

Sayaç ve biriktirici

4. bölümde döngülerde iki değişken rolü görmüştük:

  • Sayaç: kaç kez işlem yapıldığını ya da kaçıncı adımda olduğumuzu tutar.
  • Biriktirici: toplam, çarpım gibi her turda güncellenen sonucu tutar.

İkisi for ile de aynı biçimde çalışır. Aşağıdaki program 1’den 5’e kadar sayıları topluyor. sayi, range() çağrısından sırayla gelen değerdir, toplam ise biriktiricidir. Son satır ne yazar?

Çıktı 15 olur. İzleme tablosu her turu gösterir:

sayi Yeni toplam
1 1
2 3
3 6
4 10
5 15

Toplam değişkeninin her döngü turunda nasıl güncellendiğini gösteren biriktirme kalıbı.

Biriktirme kalıbı

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. Aşağıdaki kod 1–20 arasında 3 ile tam bölünen sayıları sayıyor. Kaç sayı bulur?

Buradaki sayaç her yinelemede 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 kaç çift sayı olduğunu sayıyor. Çalıştırmadan önce sonucu tahmin edin:

Sonuç 7 olur: 2, 4, 6, 8, 10, 12, 14. range(1, 16) 15’te biter ve 15 tek sayıdır.

Arama kalıbı ve break

Bir aralıkta aradığımız ilk değeri bulduktan sonra döngünün devam etmesine gerek kalmayabilir. break, içinde bulunduğu döngüyü hemen bitirir.

Aşağıdaki kod 50’den büyük ve 7 ile tam bölünen ilk sayıyı arıyor. Kaç satır yazar?

Tek satır yazılır: Bulundu: 56. 56 koşulu sağlayan ilk sayıdır ve break döngüyü orada bitirir. 63, 70 gibi öteki katlara hiç bakılmaz.

Important

break çalıştığında döngü, koşulu yanlış olduğu için değil, programcı o noktada bitirmek istediği için biter. Gereksiz yere kullanılan break kodun akışını izlemeyi zorlaştırabilir. Aranan sonuç bulunduktan sonra kalan turlar bir işe yaramıyorsa break kullanmak uygundur.

Alıştırma: ilk uygun katı bulun

30’dan büyük, 8 ile tam bölünen ilk sayıyı bulun. Aşağıdaki program uygun değerlerin hepsini 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)
        break

Geçerli girdi gelene kadar: while True + break

Geçen hafta input() satırını döngüden önce ve döngü içinde iki kez yazdığımız örneği gördük. Artık break’i bildiğimize göre aynı akışı tek bir input() satırıyla yazabiliriz:

while True:
    puan = int(input("1-5 arasında puan: "))

    if 1 <= puan <= 5:
        break

    print("Geçersiz değer")

print("Kabul edilen puan:", puan)

while True koşulu hiçbir zaman yanlış olmaz. Bu yüzden bu kalıpta çıkış koşulunu ve break satırını sizin yazmanız gerekir. Geçerli değer gelince break döngüyü bitirir. Değer geçersizse yeni bir yineleme başlar ve puan yeniden sorulur.

Note

Bu örnek de kullanıcının int() ile sayıya çevrilebilecek bir değer yazdığını varsayar. Sayıya çevrilemeyen metinle ne yapılacağını 13. haftada, istisnalar konusunda öğreneceğiz.

continue: bu yinelemenin kalanını atla

continue döngüyü bitirmez. O anki yinelemenin geri kalanını atlar ve bir sonraki yinelemeye geçer.

Tek ve basit bir koşul için çoğu zaman continue gerekmez. Örneğin yalnızca saat == 3 durumunu atlamak istiyorsanız if saat != 3: yazmanız yeterlidir. continue en çok, veriyi işlemeden önce birden fazla geçersiz durumu ayıklamak gerektiğinde işe yarar. Asıl işi yapan satırlar böylece daha sade kalır.

for bir listenin elemanlarını da sırayla alabilir. Aşağıdaki kodda for sicaklik in olcumler: her turda listeden bir ölçüm alır. -50 derecenin altındaki ve 60 derecenin üstündeki değerleri geçersiz sayıyoruz. Program iki satır yazar. Hangi sayılar?

Bu örnekte iki eleme koşulu, toplama ve sayma satırlarından önce gelir. Geçersiz bir değerde continue çalışınca toplam ve sayaç güncellenmez, döngü sonraki ölçümle devam eder.

-80 ilk koşula, 75 ikinci koşula takılır ve ikisi de atlanır. Geriye 22, 24 ve 19 kalır. Çıktı Geçerli ölçüm: 3 ve Toplam: 65 olur.

Tip

Aynı işi continue olmadan daha kısa ve açık bir koşulla yazabiliyorsanız onu seçin. Ama bir veriyi atlamak için birden fazla kontrol yapıyorsanız continue, asıl işi yapan satırları daha az girintili ve daha okunur tutabilir.

Özel bitirme değeri (sentinel)

Kaç veri geleceği baştan belli değilse for range(...) işe yaramayabilir. Kullanıcı veri girişini özel bir değer yazarak bitiriyorsa geçen haftaki while yapısını kullanırız.

Ö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 bir harcama değildir, yalnızca girişin bittiğini bildirir. Bu tür değere özel bitirme değeri (sentinel) denir.

Note

Gerçek bir programda girilen tutarın geçerli olup olmadığı ayrıca kontrol edilmelidir. Bu örnekte -1 dışında negatif değer girilmediğini ve kullanıcının boş giriş yapmadığını varsayıyoruz. Kullanıcı hiçbir şey yazmadan Enter’a basarsa float("") dönüşümü ValueError hatası verir. Bu tür dönüşüm hatalarını yakalamayı 13. haftada try/except ile göreceğiz.

İç içe döngü ne zaman gerekir?

Bir tekrarın içinde başka bir tekrar gerekiyorsa döngüleri iç içe yazarız. Bu derste iç içe döngüyü yalnızca problemde gerçekten iki ayrı tekrar olduğunda kullanacağız: katlar ve her kattaki odalar gibi.

Aşağıdaki kod iki katlı ve her katta üç odası olan bir binanın oda etiketlerini yazdırıyor. Dış döngünün her yinelemesinde iç döngü baştan sona çalışır. Kaç satır yazılır?

Dış döngü kat için 1 ve 2 değerlerini alır. Her katta iç döngü oda için 1, 2, 3 değerlerini dolaşır. Ekrana toplam 2 × 3 = 6 satır yazılır.

Bu hafta yıldızlarla üçgen çizmek gibi karmaşık desenlere girmeyeceğiz. Aklınızda şu kalsın: problemde birbirinden bağımsız iki tekrar varsa iç içe döngü gerekebilir.

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()

Tabloyu kesin bir kural gibi okumayın: aynı problem çoğu zaman iki yapıyla da çözülebilir. Seçerken kodun niyetini en açık anlatan yapıyı tercih edin.

Soruya dönelim: kâğıt okuma adımları Python’da

Bölümün başında sınav kâğıtlarını okuma adımlarını yazıp dört durumla denemiştiniz. Python’daki karşılıkları şöyle:

Durum Sözde kodda Python’da Dikkat
30 numaralı kâğıt okunuyor mu? “1’den 30’a kadar her kâğıt için” for no in range(1, 31): range(1, 30) yazılırsa 30 numaralı kâğıt okunmaz: bitiş değeri dışarıda kalır
Geçenler ve ortalama “Geçtiyse sayacı bir artır, puanı toplama ekle” if puan >= 50: altında gecen = gecen + 1, her kâğıtta toplam = toplam + puan Sayaç if dışında artarsa geçenleri değil kâğıtları sayar
Boş kâğıt “Kâğıt boşsa sonrakine geç” if puan == "boş": altında continue Boş kâğıt 0 puan sayılırsa ortalama düşer. Ortalama, okunan kâğıt sayısına bölünür, 30’a değil
100 alan var mı? “100’ü bulunca dur” if puan == 100: altında break break olmazsa 3 numaralı kâğıttan sonraki 27 kâğıt da boşuna okunur
Mazeret kâğıtları “‘Bitti’ sayfası gelene kadar oku” while ve özel bitirme değeri Kaç kâğıt geleceği belli olmadığı için range() ile sınır yazılamaz

Listenizi tabloyla karşılaştırın. “1’den 30’a kadar” yazdıysanız Türkçede doğru, ama Python’da bitiş sayısı bir fazla yazılır. Boş kâğıdı hiç düşünmediyseniz program da düşünmez: o kâğıtta ya hata verip durur ya da kâğıdı ortalamaya yanlış bir değerle katar. Mazeret kâğıtları için “30 kere oku” gibi bir sayı yazdıysanız, o sayının nereden geldiğini kendinize sorun.

Değiştir: taksit planını inceleyin

12000 TL’lik bir ürün 6 eşit taksitle ödenecek olsun:

Şunları deneyin:

  1. taksit_sayisi değerini 4 yapın.
  2. İlk ve son ayın ay değerini tahmin edin.
  3. range(1, taksit_sayisi) yazarsanız son taksitte ne olur?
  4. Her ayın başındaki ve sonundaki kalan değerini küçük bir izleme tablosuna yazın.

Üret: sınav kâğıtlarını okuyun

Açılış sorusundaki destenin ilk sekiz kâğıdı aşağıdaki puanlar listesinde. Boş kâğıt "boş" metniyle gösteriliyor. Programı, şu iki satırı yazdıracak biçimde tamamlayın:

  • Geçen öğrenci sayısı (50 ve üstü geçer)
  • Boş olmayan kâğıtların puan ortalaması

Kabul kriterleri:

  • for ile listedeki her eleman dolaşılmalı.
  • Boş kâğıt continue ile atlanmalı: ne geçenlere ne ortalamaya girmeli.
  • Tam 50 alan öğrenci geçmiş sayılmalı.
  • Geçen sayısı 5, ortalama yaklaşık 67.14 çıkmalı.

Döngünün ilk satırı boş kâğıdı ayıklasın: if puan == "boş": altında continue. Bu satırdan sonra gelen her şey yalnız okunan kâğıtlarda çalışır.

puanlar = [70, 45, 100, 85, "boş", 30, 50, 90]

gecen = 0
toplam = 0
okunan = 0

for puan in puanlar:
    if puan == "boş":
        continue

    okunan = okunan + 1
    toplam = toplam + puan

    if puan >= 50:
        gecen = gecen + 1

print("Geçen:", gecen)
print("Ortalama:", toplam / okunan)

Sınav provası

Önce kendi cevabınızı seçin, sonra cevap anahtarında her şıkkın neden doğru ya da yanlış olduğunu okuyun. Yanlış şıklar rastgele yazılmadı; bu konuda öğrencilerin gerçekten yaptığı hatalardan seçildi. Sınav soruları da aynı yolla hazırlanır.

Madde 1. range(1, 5) hangi değerleri üretir?

  • A. 1, 2, 3, 4
  • B. 0, 1, 2, 3, 4
  • C. 1, 5
  • D. 5, 4, 3, 2, 1
  • E. 1, 2, 3, 4, 5

Madde 2. print(range(5)) neden [0, 1, 2, 3, 4] yazdırmaz?

  • A. Değerler ancak bir değişkene atandıktan sonra görünür
  • B. range() yalnızca for içinde kullanılabilir
  • C. range(5) bir liste değil, range nesnesidir
  • D. print() listeleri yazdıramaz
  • E. range(5) boş bir nesne üretir

Madde 3. range(5, 0, -1) neden 0 değerini üretmez?

  • A. 0 değeri Python’da özel olduğu için atlanır
  • B. Negatif adımda range() hiçbir değer üretmez
  • C. Bitiş değeri negatif adımda da dışarıda kalır; sayma 1’de durur
  • D. Adım negatif olduğunda başlangıç da dışarıda kalır
  • E. range() yalnızca artan yönde çalışır

Madde 4. Aşağıdaki program ne yazdırır?

toplam = 0

for i in range(1, 5):
    toplam = toplam + i

print(toplam)
  • A. 10
  • B. 4
  • C. 15
  • D. 1234
  • E. 0

Madde 5. 50’nin altındaki puanları saymak isteniyor. Boşluğa ne gelmelidir?

puanlar = [70, 45, 90, 30]
kalan = 0

for puan in puanlar:
    if puan < 50:
        ______

print(kalan)
  • A. print(kalan)
  • B. kalan = kalan + puan
  • C. kalan = puan
  • D. kalan = kalan + 1
  • E. kalan = 1

Madde 6. break ile continue arasındaki temel fark nedir?

  • A. İkisi de döngüyü bitirir; continue ayrıca bir mesaj yazar
  • B. break yalnızca while, continue yalnızca for içinde kullanılır
  • C. break bir yinelemeyi atlar; continue döngüyü bitirir
  • D. break programı sonlandırır
  • E. break döngüyü bitirir, continue sonraki tura geçer

Madde 7. Aşağıdaki program ne yazdırır?

for sayi in [3, 8, 12, 20]:
    if sayi > 10:
        print(sayi)
        break
  • A. 12 ve 20
  • B. 20
  • C. 3, 8, 12, 20
  • D. 12
  • E. Hiçbir şey yazmaz

Madde 8. Aşağıdaki program ne yazdırır?

for i in range(1, 6):
    if i == 3:
        continue
    print(i)
  • A. 1, 2
  • B. 1, 2, 4, 5
  • C. 3
  • D. 1, 2, 3, 4, 5
  • E. 4, 5

Madde 9. Aşağıdaki kalıpta döngünün gerçekten sonlanmasını sağlayan şey nedir?

while True:
    deger = input("Puan: ")
    if deger.isdigit():
        break
    print("Geçersiz, tekrar deneyin.")
  • A. print() satırının en sonda olması
  • B. Koşul sağlandığında çalışan break satırı
  • C. input() çağrısının veri bitince durması
  • D. while True koşulunun bir süre sonra yanlış olması
  • E. isdigit() çağrısının döngüden çıkması

Madde 10. Bir problemde for yerine while kullanmak ne zaman daha açıklayıcıdır?

  • A. Her zaman; for yalnızca listelerde kullanılır
  • B. Sonucu bir değişkende biriktirecekseniz
  • C. Döngü içinde if kullanılacaksa
  • D. Döngü ondan fazla tur dönecekse
  • E. Tekrar sayısı baştan belli olmadığında

Madde 1. Doğru: A. Başlangıç dâhil, bitiş hariçtir; 5 üretilmez.

  • B yanlış: range(5) 0’dan başladığı için her range() çağrısı 0’dan başlıyormuş gibi düşünülür. Ama iki sayı verildiğinde ilki başlangıçtır; sayma 1’den başlar.
  • C yanlış: Parantezdeki iki sayı üretilecek değerler gibi okunabilir. Ama bunlar aralığın başı ve sonudur; range() aradaki bütün değerleri üretir.
  • D yanlış: İki sayının yer değiştirdiği düşünülüp geriye sayma beklenebilir. Ama geriye saymak için üçüncü sayı olarak negatif bir adım vermek gerekir; burada adım 1’dir.
  • E yanlış: Günlük dilde “1’den 5’e kadar” dendiğinde 5 de sayılır, bu yüzden range(1, 5) da öyle okunur. Ama bitiş değeri hiçbir zaman üretilmez. 5’i de istiyorsanız range(1, 6) yazılır.

Madde 2. Doğru: C. range() değerleri gerektiğinde üreten ayrı bir nesnedir. print() bu nesneyi range(0, 5) biçiminde yazar. Değerleri liste olarak görmek için list(range(5)) yazılabilir.

  • A yanlış: Değerleri çoğu zaman önce bir değişkene atayıp sonra yazdırdığımız için akla yatkındır. Ama atama nesnenin türünü değiştirmez; yine range olarak yazılır.
  • B yanlış: range() hemen her örnekte for ile birlikte göründüğü için akla gelir. Ama list(range(5)) gibi başka yerlerde de kullanılabilir; yalnızca kendisi bir liste değildir.
  • D yanlış: Beklenen liste ekranda görünmediği için sorun print()te aranabilir. Ama print([0, 1, 2]) sorunsuz çalışır; sorun değerin liste olmaması.
  • E yanlış: Çıktıda sayılar görünmediği için nesnenin boş olduğu sanılabilir. Ama boş değildir; for ile dolaşıldığında beş değer verir.

Madde 3. Doğru: C. Kural yön değiştirmez: başlangıç dâhil, bitiş hariç. Sonuç 5, 4, 3, 2, 1 olur.

  • A yanlış: 0 çoğu zaman “hiç” anlamına geldiği için ayrıca atlanıyormuş gibi görünür. Ama 0 için özel bir kural yok; range(5, -1, -1) yazılsaydı 0 da üretilirdi.
  • B yanlış: Örneklerin çoğu artan yönde ilerlediği için negatif adım geçersiz sanılabilir. Ama range() başlangıç bitişten büyük olduğu sürece geriye doğru sayar ve 5, 4, 3, 2, 1 üretir.
  • D yanlış: Yön değişince kuralın da ters döndüğü düşünülebilir. Ama başlangıç her zaman dâhildir; 5 üretilir.
  • E yanlış: range() çoğu örnekte yukarı doğru saydığı için öyle sanılır. Ama üçüncü sayı negatif verilirse azalan yönde de çalışır.

Madde 4. Doğru: A. 1 + 2 + 3 + 4 toplamı 10’dur; 5 üretilmediği için toplama girmez.

  • B yanlış: Döngüdeki son değer 4 olduğu için toplam’ın da onu tuttuğu sanılabilir. Ama toplam biriktiricidir; her turda önceki değerin üstüne eklenir.
  • C yanlış: 1’den 5’e kadar toplam 15 olduğu için 5 de hesaba katılmış. Ama range(1, 5) 5’i üretmez; toplam 1 + 2 + 3 + 4 olur.
  • D yanlış: + metinlerde birleştirme yaptığı için sayıların yan yana yazılacağı sanılabilir. Ama toplam ve i sayıdır; + burada toplama yapar.
  • E yanlış: toplam = 0 satırı göze çarptığı için değişkenin orada kaldığı düşünülebilir. Ama döngü dört kez çalışır ve her turda toplam büyür.

Madde 5. Doğru: D. Sayaç, koşul sağlandığında birer artar. Çıktı 2 olur.

  • A yanlış: Koşul sağlanınca bir şey göstermek istenebilir. Ama yazdırmak sayacı artırmaz; kalan hep 0 kalır.
  • B yanlış: Biriktirme kalıbı toplam = toplam + sayi biçiminde yazıldığı için sayma da öyle yazılır sanılır. Ama bu satır puanları toplar ve 75 verir; kaç puan olduğunu saymaz.
  • C yanlış: Koşulu sağlayan puanı değişkene aktarmak doğal görünür. Ama her seferinde üzerine yazılır; sonuçta yalnızca son düşük puan, 30 kalır.
  • E yanlış: Koşul sağlanınca “bir tane bulundu” demek doğru gibi görünür. Ama bu satır kaç kez çalışırsa çalışsın sonuç 1 kalır; önceki değere eklenmez.

Madde 6. Doğru: E. break döngüden tamamen çıkar. continue yalnızca o yinelemenin kalanını atlar ve döngü sonraki turla devam eder.

  • A yanlış: İkisi de döngünün olağan akışını kestiği için aynı işi yapıyor gibi görünür. Ama continue döngüyü bitirmez ve kendiliğinden bir şey yazmaz.
  • B yanlış: while True ile break kalıbı sık görüldüğü için break whilea özgü sanılabilir. Ama ikisi de her iki döngü türünde kullanılabilir.
  • C yanlış: İki sözcük aynı yerlerde, döngünün içinde bir if altında göründüğü için görevleri kolayca karışır. Ama görevler ters yazılmış: döngüyü break bitirir, continue yalnız o turu atlar.
  • D yanlış: breakten sonra döngünün çıktısı kesildiği için program durmuş gibi görünebilir. Ama programı değil, yalnızca içinde bulunduğu döngüyü sonlandırır; döngüden sonraki satırlar çalışır.

Madde 7. Doğru: D. İlk uygun değer bulunduğunda break döngüyü bitirir; 20’ye hiç bakılmaz.

  • A yanlış: İki değer de 10’dan büyük olduğu için ikisi de yazılır sanılır. break olmasaydı öyle olurdu, ama burada döngü ilk eşleşmede biter.
  • B yanlış: “Aranan değer” en büyük değer gibi düşünülebilir. Ama döngü listeyi baştan dolaşır ve koşulu sağlayan ilk değer 12’dir.
  • C yanlış: Döngü listenin her elemanına baktığı için hepsi yazılır sanılabilir. Ama print() if bloğunun içinde; yalnız 10’dan büyük değerlerde çalışır.
  • E yanlış: break döngüyü bitirdiği için hiçbir şeyin yazılmadığı düşünülebilir. Ama break’ten önce print(sayi) çalışır ve 12 yazılır.

Madde 8. Doğru: B. i 3 olduğunda continue o turun kalanını atlar; döngü sonraki değerle devam eder.

  • A yanlış: continue de akışı kestiği için döngünün 3’te bittiği sanılabilir. Ama continue döngüyü bitirmez; bu break davranışı olurdu.
  • C yanlış: Koşulu sağlayan değerin yazdırıldığı arama örnekleriyle karışabilir. Ama continue tam tersini yapar: 3 turunun kalanını atlar.
  • D yanlış: continue ekrana bir şey yazmadığı için hiçbir etkisi yokmuş gibi görünebilir. Ama 3 turunda print() satırına hiç gelinmez.
  • E yanlış: continue’dan sonra yazdırmanın başladığı düşünülebilir. Ama 1 ve 2 koşulu sağlamaz ve ikisi de yazılır.

Madde 9. Doğru: B. while True kendiliğinden hiç bitmez; çıkışı yalnızca break sağlar.

  • A yanlış: Gövdenin son satırı döngünün bittiği yer gibi görünür. Ama print() yalnızca mesaj yazar; akışı değiştirmez ve tur yeniden başlar.
  • C yanlış: Kullanıcı geçerli değeri yazınca girişin bittiği hissedilir. Ama input() her çağrıldığında yeniden sorar; döngüyü kendisi bitirmez.
  • D yanlış: while döngüleri koşulları yanlış olunca bittiği için bu döngünün de öyle biteceği düşünülür. Ama True sabittir ve hiçbir zaman yanlış olmaz.
  • E yanlış: Çıkış kararı isdigit() sonucuna bağlı olduğu için çıkışı onun yaptığı sanılabilir. Ama isdigit() yalnızca True ya da False döndürür; döngüden çıkışı break yapar.

Madde 10. Doğru: E. Tekrar bir koşulun sürmesine bağlıysa kaç tur olacağı önceden bilinmez. Geçerli girdi gelene kadar sormak buna bir örnektir; while bu koşulu doğrudan yazar.

  • A yanlış: for çoğu örnekte bir liste üzerinde dolaştığı için böyle düşünülebilir. Ama for range() ile sayısal aralıklarda da kullanılır.
  • B yanlış: Biriktirme ilk kez while örnekleriyle gösterildiği için akla gelir. Ama biriktirme her iki döngüde de yapılabilir.
  • C yanlış: while bir koşulla çalıştığı için if ile daha uyumlu sanılabilir. Ama if iki döngü türünde de kullanılabilir; seçimi belirlemez.
  • D yanlış: Uzun döngülerin while ile yazılması gerektiği sanılabilir. Ama tur sayısının büyüklüğü değil, baştan bilinip bilinmediği belirleyicidir.

Tek sayfa özet

Bu hafta belirli sayıda tekrarı for ve range() ile yazdık ve sık kullanılan döngü kalıplarını gördük.

  • for, bir range() nesnesinin ya da bir listenin değerlerini sırayla alır ve her değer için gövdeyi bir kez çalıştırır.
  • range() bir liste değil, aralıktaki değerleri sırayla veren ayrı bir range nesnesidir; değerleri görmek için list(range(...)) kullanılabilir.
  • range() bitiş değerini, adım pozitif de olsa negatif de olsa dâhil etmez.
  • range(baslangic, son, adim) ile başlangıç ve ilerleme miktarı belirlenebilir.
  • Sayaç bir şeyin kaç kez olduğunu, biriktirici ise toplam gibi biriken sonucu tutar.
  • Koşulu sağlayan değerleri saymak için sayaç yalnızca if doğru olduğunda artırılabilir.
  • break aranan sonuç bulunduğunda ya da geçerli girdi alındığında döngüyü tamamen bitirebilir.
  • while True + break ile geçerli girdi gelene kadar sorma kalıbında input() satırını iki kez yazmak gerekmez.
  • continue yalnızca o anki yinelemenin kalanını atlar; özellikle geçersiz veriyi birden fazla kontrolle ayıklarken işe yarar.
  • Tekrar sayısı baştan biliniyorsa for, koşula bağlı belirsiz tekrar için while ç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; boş ya da sayıya çevrilemeyen girdi ise ayrıca kontrol edilmelidir.
  • İç içe döngü, problemde gerçekten iki ayrı tekrar olduğunda kullanılmalıdır.

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.

Bu bölümün kazanımları

Bu bölümü bitiren öğrenci:

  • range() nesnesinin ürettiği değerleri belirler ve listeden farkını açıklar.
  • range() çağrısının farklı biçimlerini kullanır ve bitiş değerinin dışarıda kaldığını hesaba katar.
  • Sayma ve biriktirme kalıplarını for ile kurar.
  • Arama kalıbında break ile döngüyü erken bitirir.
  • continue ile yalnızca o yinelemenin kalanını atlar.
  • while True ve break ile geçerli girdi gelene kadar soran döngüyü yazar ve bu kalıbı sentinel kullanımından ayırt eder.
  • Problemin yapısına göre for ile while arasında seçim yapar.
Back to top