while döngüsü ve kod izleme

Şimdiye kadar bir kararın sonucuna göre farklı bir blok çalıştırdık; fakat her blok en fazla bir kez yürütüldü. Gerçek programlarda bazı işlemleri koşul doğru olduğu sürece tekrar etmek gerekir.

Bir kullanıcıdan geçerli değer gelene kadar yeniden istemek, belirli sayıda deneme yapmak, sayaç ilerledikçe ölçüm değerlerini işlemek veya bir hedefe ulaşana kadar hesaplamayı sürdürmek bu tür problemlerdir. Python’da koşula bağlı tekrar için while döngüsü kullanılır.

Bu hafta asıl hedef döngü sözdizimini ezberlemek değil, her yinelemede değişkenlerin nasıl değiştiğini izleyebilmek ve döngünün neden sonlandığını açıklayabilmektir.

Bu bölümün kapsamı

NoteSınavda sorulur
  • while koşulunun her yinelemeden önce sınanması
  • koşul başta yanlışsa gövdenin hiç çalışmaması
  • başlangıç, koşul ve güncellemenin birlikte kurulması
  • sonsuz döngünün nedeni ve çalışan programı kesme
  • kod izleme tablosuyla yineleme başına değer takibi
  • sınırın kapsanmasından doğan off-by-one hatası
  • sayaç ile biriktiricinin ayrımı
  • döngülerin çalışma süresi ve başarım karşılaştırması
  • while ile birlikte kullanılan else bloğu

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

Bu döngü kaç kez çalışır?

Döngünün kaç tur döneceği üç karara bağlıdır: nereden başladığı, ne zaman duracağı ve her turda neyin değiştiği. Üçü uyumsuzsa döngü ya bir eksik çalışır, ya bir fazla, ya da hiç durmaz.

while: koşul doğru olduğu sürece tekrar et

while döngüsünde koşul kontrolü, gövde, güncelleme ve koşula geri dönüş akışı.

while döngüsünün akışı

En temel biçim şöyledir:

sayac = 1

while sayac <= 3:
    print(sayac)
    sayac = sayac + 1

Programın çalışma sırası:

  1. sayac <= 3 koşulu kontrol edilir.
  2. Koşul True ise döngü gövdesi çalışır.
  3. sayac bir artırılır.
  4. Program yeniden while satırına döner.
  5. Koşul False olduğunda döngü biter.

Bu program şu çıktıyı üretir:

1
2
3

while koşulu her yinelemeden önce kontrol edilir. Bu nedenle başlangıçta koşul False ise döngü gövdesi hiç çalışmayabilir.

Tahmin et — döngü kaç kez çalışır?

Aşağıdaki kodu çalıştırmadan önce çıktı satırlarını tahmin edin:

Döngü gövdesi sayac değerleri 2, 4 ve 6 iken çalışır. sayac 8 olduğunda koşul False olur.

Burada önemli soru yalnızca “kaç çıktı var?” değildir. Her yinelemede şu üç noktayı düşünün:

  • Döngü başındaki sayac değeri,
  • Koşulun sonucu,
  • Gövde sonunda oluşan yeni sayac değeri.

Kod izleme tablosu

Kısa döngülerde değişkenleri zihinden takip edebiliriz; ancak döngü büyüdükçe hata yapma olasılığı artar. Basit bir kod izleme tablosu kullanmak yararlıdır.

Aşağıdaki programı ele alalım:

sayac = 1
toplam = 0

while sayac <= 4:
    toplam = toplam + sayac
    sayac = sayac + 1

print(toplam)

İzleme tablosu:

Yineleme Döngü başında sayac toplam sonrası Gövde sonunda sayac
1 1 1 2
2 2 3 3
3 3 6 4
4 4 10 5

Sonraki kontrolde 5 <= 4 sonucu False olur ve döngü biter. Ekrana 10 yazdırılır.

Döngü içinde değişkenlerin tur tur nasıl değiştiğini gösteren kod izleme tablosu.

Kod izleme
Tip

Döngüde hata ararken yalnızca sonuca bakmayın. İlk birkaç yinelemede değişken değerlerini tabloya yazmak, hatanın hangi adımda başladığını görünür kılar.

Sayaç neden güncellenir?

Bir sayaç döngünün ilerlemesini temsil eder. Aşağıdaki satır kritik önemdedir:

sayac = sayac + 1

Bu satır olmasaydı sayac sürekli 1 kalır ve sayac <= 3 koşulu hep True olurdu.

İncele ve düzelt — sonsuz döngü

Aşağıdaki program bilinçli olarak hatalıdır. Amaç 1, 2, 3 değerlerini yazdırıp durmaktır.

Eksik sayaç güncellemesini ekleyin.

print(sayac) satırından sonra sayac = sayac + 1 ekleyebilirsiniz.

sayac = 1

while sayac <= 3:
    print(sayac)
    sayac = sayac + 1
Warning

Quarto Live hücrelerinde çalışma süresi sınırı bulunsa da gerçek programlarda sonsuz döngü işlemciyi gereksiz yere meşgul edebilir. Terminalde veya VS Code terminalinde program durmuyorsa Ctrl+C ile çalışan Python sürecini kesebilirsiniz; Python bunu çoğu zaman KeyboardInterrupt olarak bildirir. VS Code’un çalıştırma görünümünde Stop düğmesi de aynı amaçla kullanılabilir.

Döngü yazarken “bu koşulu bir gün False yapacak değişiklik nerede?” sorusunu mutlaka sorun. Ctrl+C sorunu çözen program mantığı değildir; yalnızca yanlışlıkla başlattığınız çalışmayı durdurmanın yoludur.

off-by-one hatası

Bir döngü istenenden bir kez fazla veya bir kez az çalışıyorsa sık karşılaşılan nedenlerden biri off-by-one hatasıdır.

Örneğin 1’den 5’e kadar sayıları yazdırmak istiyoruz:

sayac = 1

while sayac < 5:
    print(sayac)
    sayac = sayac + 1

Bu program 5 değerini yazdırmaz. Koşul sayac <= 5 olmalıdır.

Sınır değerlerini düşünmek burada da işe yarar:

  • İlk çalışması gereken değer: 1
  • Son çalışması gereken değer: 5
  • İlk çalışmaması gereken değer: 6

Alıştırma — geri sayımı düzeltin

Amaç 5, 4, 3, 2, 1 değerlerini yazdırmaktır. Mevcut kod 1 değerini atlıyor.

Koşulu düzeltin.

> yerine >= kullanmayı düşünün.

sayac = 5

while sayac >= 1:
    print(sayac)
    sayac = sayac - 1

Başlangıç değeri de sonucu etkiler

Döngünün koşulu doğru olsa bile başlangıç değeri yanlışsa sonuç yine hatalı olabilir.

sayac = 0

while sayac <= 5:
    print(sayac)
    sayac = sayac + 1

Eğer amaç 15 aralığını yazdırmaksa koşul değil, başlangıç değeri sorunludur.

Bu yüzden sayaç döngülerinde üç parçayı birlikte kontrol edin:

başlangıç değeri → devam koşulu → güncelleme

Bu üçlüden herhangi biri yanlışsa döngü farklı sayıda çalışabilir.

Değiştir — deneme hakkını izleyin

Bir sistemin kullanıcıya en fazla 3 deneme verdiğini düşünelim. Burada henüz gerçek parola girişi yapmıyoruz; yalnızca deneme sayısını izliyoruz.

Şunları sırayla deneyin:

  1. En fazla 5 deneme olacak biçimde değiştirin.
  2. İlk denemenin 0 olarak yazılmasına yol açan bir başlangıç değeri verin ve farkı gözlemleyin.
  3. Koşulu < 3 yapın. Kaç deneme kaldığını tahmin edin.
  4. Her değişiklikte programı çalıştırmadan önce kaç yineleme olacağını yazın.

Koşula bağlı olarak değer biriktirmek

while yalnızca sayaç yazdırmak için kullanılmaz. Her yinelemede bir değeri güncelleyebiliriz.

Örneğin haftada 250 TL birikim yapan bir kişinin 1000 TL hedefe ulaşmasını izleyelim:

Burada iki değişken değişir:

  • birikim: hedefe ne kadar yaklaşıldığını tutar,
  • hafta: kaç yineleme yapıldığını sayar.

Döngü birikim < 1000 koşulu False olduğunda biter.

Alıştırma — hedefe ulaşma sayısını bulun

Bir uygulama her gün 1200 adım artırarak 6000 adımlık toplam hedefe ulaşmayı simüle etsin. Programın kaç gün gerektiğini hesaplamasını sağlayın.

Gövde içinde iki güncelleme gerekir: toplam_adim = toplam_adim + 1200 ve gun = gun + 1.

toplam_adim = 0
gun = 0

while toplam_adim < 6000:
    toplam_adim = toplam_adim + 1200
    gun = gun + 1

print("Gün:", gun)
print("Toplam adım:", toplam_adim)

Kullanıcı girdisini tekrar istemek

Geçerli değer gelene kadar kullanıcıdan yeniden girdi alma akışı.

Koşullu tekrar

while döngüsünün önemli kullanım alanlarından biri geçerli girdi gelene kadar yeniden sormaktır. Örneğin yalnızca 15 aralığında puan kabul eden bir program:

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

while puan < 1 or puan > 5:
    print("Geçersiz değer")
    puan = int(input("1-5 arasında puan: "))

print("Kabul edilen puan:", puan)

Bu örnekte ilk girdi geçerliyse döngü hiç çalışmaz. Geçersizse yeni değer alındıktan sonra koşul yeniden değerlendirilir.

Dikkat ederseniz aynı input() satırı döngüden önce ve döngünün içinde iki kez yazıldı. Bu, while koşulunu ilk kez sınayabilmek için başlangıç değeri hazırlayan klasik bir kalıptır; ancak kod tekrarına yol açar.

NoteBu tekrarı gelecek hafta kaldıracağız

Beşinci bölümde break öğrendiğimizde aynı problemi while True: ile tek bir input() satırı kullanarak yazabileceğiz: girdiyi al, geçerliyse döngüden çık, değilse yeniden dene. Bu hafta henüz break öğretmediğimiz için mevcut biçim bilinçli olarak kullanılıyor.

Note

Bu hafta girdinin int() ile dönüştürülebilen bir sayı olduğunu varsayıyoruz. "abc" gibi sayıya çevrilemeyen girdileri istisnalar konusuna geldiğimizde ele alacağız.

Üret — cihaz şarjını hedefe ulaştırın

Bir cihazın şarjı başlangıçta %20 olsun. Her şarj adımında seviye 15 puan artsın. Şarj seviyesi en az %80 olduğunda döngü durmalı.

Aşağıdaki başlangıç kodunu tamamlayın:

Kabul kriterleri:

  • Döngü sarj < 80 olduğu sürece çalışmalı,
  • Her yinelemede sarj değeri 15 artmalı,
  • adim değeri her yinelemede 1 artmalı,
  • Döngü sonunda sarj en az 80 olmalı.

İskelet: while sarj < 80:. Gövdede iki ayrı değişken güncellenmeli.

sarj = 20
adim = 0

while sarj < 80:
    sarj = sarj + 15
    adim = adim + 1

print("Son şarj:", sarj)
print("Adım sayısı:", adim)

Sınav provası

Önce kendi cevabını seç; sonra cevap anahtarında her şıkkın neden doğru veya yanlış olduğunu oku. Çeldiriciler uydurma değil, bu konuda gerçekten yapılan hatalardır. Sınav maddeleri de bu mantıkla yazılır.

Madde 1. while döngüsünde koşul ne zaman sınanır?

  • A. Her yinelemeden sonra; gövde en az bir kez çalışır
  • B. Yalnızca döngüye ilk girişte
  • C. Gövdenin ortasında, güncelleme satırından hemen sonra
  • D. Program başlarken bir kez, sonra sonuç saklanır
  • E. Her yinelemeden önce; koşul yanlışsa gövde o tur hiç çalışmaz

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

sayac = 10

while sayac < 5:
    print(sayac)
    sayac = sayac + 1
  • A. Hiçbir şey yazmaz
  • B. 10
  • C. 10dan 4e kadar olan sayılar
  • D. Sonsuz döngüye girer
  • E. Hata verir; koşul başlangıçta yanlış olamaz

Madde 3. sayac = 1 ile başlayan ve while sayac < 5: koşulunu kullanan bir döngü, gövdesinde sayac birer artarken hangi sayıları yazdırır?

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

Madde 4. Aşağıdaki döngü neden hiç bitmez?

sayac = 1

while sayac <= 5:
    print(sayac)
  • A. Python while döngülerini en fazla beş kez çalıştırır
  • B. print() çağrısı döngüyü yavaşlattığı için
  • C. Gövdede sayac değişmediği için koşul hep doğru kalır
  • D. <= yerine < kullanılmalıydı
  • E. Başlangıç değeri 0 olmalıydı

Madde 5. Aşağıdaki döngü bittiğinde toplam değişkeninin değeri nedir?

sayi = 1
toplam = 0

while sayi <= 4:
    toplam = toplam + sayi
    sayi = sayi + 1
  • A. 15
  • B. 0
  • C. 4
  • D. 10
  • E. 5

Madde 6. off-by-one hatası çoğunlukla neden kaynaklanır?

  • A. Girintinin yanlış olmasından
  • B. Python sürümünün eski olmasından
  • C. Döngüde print() kullanılmasından
  • D. Değişken adının yanlış yazılmasından
  • E. Sınırın kapsanıp kapsanmayacağının ya da başlangıç değerinin yanlış seçilmesinden

Madde 7. Bir program 110 arasındaki sayıları toplayacak ama sonuç 45 çıkıyor. En akla yatkın neden nedir?

sayi = 1
toplam = 0

while sayi < 10:
    toplam = toplam + sayi
    sayi = sayi + 1
  • A. Koşul 10u dışarıda bırakıyor; < yerine <= gerekir
  • B. Bu sonuç doğrudur; 110 toplamı zaten 45tir
  • C. sayi iki kez artırılıyor
  • D. Başlangıç değeri 0 olmalıydı
  • E. toplam yanlış yerde güncelleniyor

Madde 8. Sayaç ile biriktirici arasındaki fark nedir?

  • A. İkisi de aynıdır; yalnızca değişken adları farklıdır
  • B. Sayaç kaç olay olduğunu tutar ve birer artar; biriktirici üzerine değer ekleyerek biriken bir sonucu tutar
  • C. Biriktirici yalnızca for döngüsünde kullanılabilir
  • D. Sayaç int, biriktirici her zaman float olmak zorundadır
  • E. Sayaç döngü dışında, biriktirici döngü içinde tanımlanır

Madde 1 — Doğru: E. Koşul başta sınandığı için döngü gövdesi sıfır kez de çalışabilir.

  • A yanlış: Bu, bazı dillerdeki do-while davranışıdır. Python’un while yapısı koşulu başta sınar.
  • B yanlış: Koşul her turun başında yeniden sınanır; yoksa döngü hiç bitmezdi.
  • C yanlış: Koşul gövdenin içinde değil, başında yer alır.
  • D yanlış: Sonuç saklanmaz; değişkenler değiştikçe koşul yeniden değerlendirilir.

Madde 2 — Doğru: A. Koşul daha ilk sınamada yanlıştır (10 < 5); gövde hiç çalışmaz.

  • B yanlış: Gövde en az bir kez çalışmaz; koşul başta sınanır.
  • C yanlış: Güncelleme artırma yönünde; sayaç zaten koşulun dışında başlıyor.
  • D yanlış: Koşul hiç sağlanmadığı için döngü daha başlamadan biter.
  • E yanlış: Koşulun başta yanlış olması geçerli bir durumdur; döngü sıfır kez çalışır.

Madde 3 — Doğru: B. Sınır 5 koşula dâhil değildir; döngü 4ten sonra biter.

  • A yanlış: 5 < 5 yanlıştır; 5 hiç yazdırılmaz. Bu koşulda <= kullanılsaydı yazılırdı.
  • C yanlış: 4 < 5 doğru olduğu için 4 de yazılır.
  • D yanlış: Başlangıç 1; 0 hiç üretilmez.
  • E yanlış: İlk tur sayac 1 iken çalışır ve 1 yazılır.

Madde 4 — Doğru: C. Döngünün bitmesi koşulu yanlışa çevirecek bir güncellemeye bağlıdır; burada öyle bir satır yok.

  • A yanlış: Böyle bir sınır yoktur; döngü koşul yanlış olana kadar sürer.
  • B yanlış: Hızla ilgisi yok; döngü hiç bitmiyor.
  • D yanlış: İşareti değiştirmek sonsuzluğu çözmez; sayac yine hiç değişmez.
  • E yanlış: Başlangıcı değiştirmek de güncelleme eksikliğini gidermez.

Madde 5 — Doğru: D. 1 + 2 + 3 + 4 toplamı 10dur; döngü sayi 5 olunca durur.

  • A yanlış: 5 hiç eklenmez; sayi 5 olduğunda koşul yanlıştır ve gövde çalışmaz.
  • B yanlış: Döngü dört kez çalışır ve her turda toplam büyür.
  • C yanlış: toplam her turda üzerine ekler; yalnızca son değeri tutmaz.
  • E yanlış: Bu, döngü bittiğinde sayi değişkeninin değeridir; sorulan toplam.

Madde 6 — Doğru: E. Bir eksik veya bir fazla yineleme neredeyse her zaman bu iki karardan birine dayanır.

  • A yanlış: Girinti hatası bloğun kapsamını değiştirir; bu ayrı bir hata türüdür.
  • B yanlış: Sürümle ilgisi yoktur; hata programcının sınır kararındadır.
  • C yanlış: print() yalnızca gösterir; yineleme sayısını etkilemez.
  • D yanlış: Yanlış ad NameError verir; sessizce bir fazla tur üretmez.

Madde 7 — Doğru: A. 1den 9a kadarki toplam 45tir. Beklenen 55 için sınırın kapsanması gerekir.

  • B yanlış: 1den 10a kadar toplam 55tir.
  • C yanlış: Kodda tek bir artırma var.
  • D yanlış: 0 eklemek toplamı değiştirmez; sonuç yine 45 kalır.
  • E yanlış: Güncelleme sırası burada sonucu değiştirmez; her tur sayi eklenir.

Madde 8 — Doğru: B. Kaç öğrenci geçti sorusunun cevabı sayaç, puanların toplamı biriktiricidir.

  • A yanlış: Ne tuttukları farklıdır; sayaç olay sayar, biriktirici değer biriktirir.
  • C yanlış: İki döngü türünde de kullanılabilir.
  • D yanlış: Tür bir ölçüt değil; biriktirici de tam sayı tutabilir.
  • E yanlış: İkisi de döngüden önce başlatılır ve döngü içinde güncellenir.

Tek sayfa özet

Bu hafta koşula bağlı tekrarı while ile kurduk.

  • while koşulu her yinelemeden önce kontrol edilir.
  • Koşul başlangıçta False ise gövde hiç çalışmayabilir.
  • Sayaç, döngünün kaçıncı adımda olduğunu izlemek için kullanılabilir.
  • Başlangıç değeri, devam koşulu ve güncelleme birlikte düşünülmelidir.
  • Döngü koşulunu değiştirecek bir güncelleme yoksa sonsuz döngü oluşabilir; yerel ortamda yanlışlıkla başlayan çalışmayı Ctrl+C ile kesebilirsiniz.
  • off-by-one hataları çoğunlukla sınırın kapsanıp kapsanmaması veya yanlış başlangıç değeri nedeniyle oluşur.
  • Kod izleme tablosu, her yinelemede değişkenlerin nasıl değiştiğini görünür kılar.
  • Bir döngüde sayaç dışında birikim, toplam veya başka durum değişkenleri de güncellenebilir.
  • Geçerli girdi gelene kadar sorma kalıbındaki yinelenen ilk okuma satırını, break öğrendikten sonra daha sade hâle getireceğiz.

Bir sonraki bölümde belirli bir aralık veya koleksiyon üzerinde tekrar için for ve range() kullanacak; sayaç, biriktirici, arama ve sayma gibi döngü problem kalıplarını geliştireceğiz.

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

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

  • while koşulunun her yinelemeden önce sınandığını gösterir.
  • Başlangıç değeri, devam koşulu ve güncellemeyi birlikte kurar.
  • Güncellemesi olmayan döngünün sonsuza gideceğini tanır ve çalışmayı nasıl keseceğini bilir.
  • Kod izleme tablosuyla her yinelemedeki değişken değerlerini takip eder.
  • Sınırın kapsanmasından doğan off-by-one hatasını açıklar.
  • Sayaç ile biriktiriciyi birbirinden ayırır.
Back to top