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 hafta neleri yapabilmelisiniz?

Bölümün sonunda:

  • while döngüsünün koşulu ne zaman kontrol ettiğini açıklayabilmeli,
  • sayaç kullanan basit bir while döngüsü yazabilmeli,
  • bir döngüyü satır satır izleyip değişken değerlerini tabloya aktarabilmeli,
  • bir döngünün kaç kez çalışacağını kodu çalıştırmadan tahmin edebilmeli,
  • sonsuz döngünün neden oluştuğunu fark edebilmeli,
  • sayaç güncellemesinin döngünün sonlanmasındaki rolünü açıklayabilmeli,
  • off-by-one hatalarını sınır değerleriyle bulabilmeli,
  • basit bir tekrar problemini while ile çözebilmelisiniz.

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

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.

Bir while döngüsünde koşul kontrolünü, sayaç güncellemesini ve yinelemeler boyunca değişken değerlerinin izlenmesini gösteren şema.
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. Döngü yazarken “bu koşulu bir gün False yapacak değişiklik nerede?” sorusunu mutlaka sorun.

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:

  • ilk çalışması gereken değer: 1
  • son çalışması gereken değer: 5
  • ilk ç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

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.

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)

Bölüm özeti

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.
  • 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.

Kendinizi kontrol edin

Kodu çalıştırmadan cevaplamaya çalışın:

  1. while koşulu gövdeden önce mi, sonra mı kontrol edilir?
  2. Aşağıdaki döngü kaç kez çalışır?
x = 1

while x < 8:
    x = x * 2
    print(x)
  1. sayac = 1 ile başlayıp while sayac < 5: kullanan bir döngü hangi sayıları yazdırır?
  2. Bir döngüde sayaç hiç güncellenmezse ne tür bir risk oluşur?
  3. 110 aralığını kapsamak için sayac < 10 mu yoksa sayac <= 10 mu gerekir?
  4. Kod izleme tablosunda hangi değişkenleri takip etmelisiniz?

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.

Back to top