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ı
whilekoş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-onehatası - sayaç ile biriktiricinin ayrımı
- döngülerin çalışma süresi ve başarım karşılaştırması
whileile birlikte kullanılanelsebloğ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
En temel biçim şöyledir:
sayac = 1
while sayac <= 3:
print(sayac)
sayac = sayac + 1Programın çalışma sırası:
sayac <= 3koşulu kontrol edilir.- Koşul
Trueise döngü gövdesi çalışır. sayacbir artırılır.- Program yeniden
whilesatırına döner. - Koşul
Falseolduğ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
sayacdeğeri, - Koşulun sonucu,
- Gövde sonunda oluşan yeni
sayacdeğ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ü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 + 1Bu 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 + 1Quarto 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 + 1Bu 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 - 1Baş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 + 1Eğer amaç 1–5 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:
- En fazla
5deneme olacak biçimde değiştirin. - İlk denemenin
0olarak yazılmasına yol açan bir başlangıç değeri verin ve farkı gözlemleyin. - Koşulu
< 3yapın. Kaç deneme kaldığını tahmin edin. - 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 1–5 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.
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.
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 < 80olduğu sürece çalışmalı, - Her yinelemede
sarjdeğeri15artmalı, adimdeğeri her yinelemede1artmalı,- Döngü sonunda
sarjen az80olmalı.
İ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)Tek sayfa özet
Bu hafta koşula bağlı tekrarı while ile kurduk.
whilekoşulu her yinelemeden önce kontrol edilir.- Koşul başlangıçta
Falseise 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+Cile kesebilirsiniz. off-by-onehataları ç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:
whilekoş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-onehatasını açıklar. - Sayaç ile biriktiriciyi birbirinden ayırır.