koddla

Yazılımcıları bilgi ile güçlendirir.

Python101 – Hata Ayıklama

Hata ayıklama nedir? 

“Programlamaya başlar başlamaz, programları doğru yapmanın düşündüğümüz kadar kolay olmadığını gördük. Hata ayıklamanın keşfedilmesi gerekiyordu. Hayatımın büyük bir bölümünü kendi programlarımda hata bulmak için harcayacağımı fark ettiğim anı tam olarak hatırlıyorum.” — Maurice Wilkes hata ayıklamayı keşfediyor, 1949

Şuana kadar gördüğümüz programlarla uğraştıysanız, muhtemelen, yazdığımız programın bazen yapmasını istemediğiniz bir şey yaptığını görmüşsünüzdür. Bu aslında oldukça yaygın bir durum. Hata ayıklama, bilgisayarın ne yaptığını keşfetme ve sonra da asıl yapmasını istediğimiz şeyi yapmaya ayarlama işlemidir. Bu biraz zor olabilir. Bir keresinde neredeyse bir hafta boyunca birinin x olması gereken yere y koymasının neden olduğu bir hatayı takip edip düzeltmiştim. 

Bu bölüm önceki bölümlere göre daha soyut olacak.

Program ne yapmalı? 

Yapılacak ilk şey (bu açık görünüyor) programın doğru çalışıyorsa ne yapması gerektiğini bulmaktır. Birkaç test denemesi kullanarak neler olacağını görebiliriz. Örneğin, bir dikdörtgenin çevresini (tüm kenarların uzunluğunun toplamı) hesaplamak için bir programımız olduğunu varsayalım. Aşağıdaki test denemelerine bakalım:

yükseklikgenişlikçevre
3414
2310
4416
228
5112

Şimdi programımızı tüm test denemeleri üzerinde çalıştırıyoruz ve programın beklediğimiz şeyi yapıp yapmadığına bakıyoruz. Eğer istediğimiz sonucu göremezsek bilgisayarın ne yaptığını öğrenmemiz gerekir.

Genel olarak test denemelerinin bazıları işe yaracak, bazıları ise işe yaramayacaktır. Bu durumda, çalışanların ortak noktasının ne olduğunu anlamaya çalışmalıyız. Örneğin, bir çevre programının çıktısına bakalım:

Yükselik: 3
Genişlik: 4
çevre = 15
Yükselik: 2
Genişlik: 3
çevre  = 11
Yükselik: 4
Genişlik: 4
çevre = 16
Yükselik: 2
Genişlik: 2
çevre = 8
Yükselik: 5
Genişlik: 1
çevre = 8

İlk iki deneme işe yaramadı, sonraki iki deneme doğru çalıştı ve sonuncusunda da işe yaramadı. Çalışanlarla ortak noktasının ne olduğunu anlamaya çalışın. Sorunun nedenini bulduğumuzda gerisi daha kolay olacak. Kendi programlarınızla daha fazla test çalışması deneyebilirsiniz.

Program ne yapıyor? Kod okuma nasıl olur?

Yapılacak bir sonraki şey kaynak koduna bakmaktır. Programlama yaparken yapılacak en önemli şeylerden biri kaynak kodunu okuyabilmektir. Bunu yapmanın birincil yolu “kod izleme yolları”dır.

Kod izleme yolu ilk satırda başlar ve program bitene kadar aşağı doğru çalışır. while döngüleri ve if deyimleri bazı satırların hiçbir zaman çalıştırılamayacağı ve bazı satırların birçok kez çalıştırılabileceği anlamına gelir. Bu şekilde her satırda Python’un ne yaptığını anlarsınız.

Basit çevre programıyla başlayalım. Programı yazmayın. Programı okuyacaksınız, çalıştırmayacaksınız. Kaynak kodu:

yukseklik = int(input("Yükseklik: "))
genislik = int(input("Genislik: "))
print("çevre =", genislik + yukseklik + genislik + genislik)

Soru: Python’un çalıştırdığı ilk satır nedir?

Cevap: İlk satır her zaman önce çalıştırılır. Bu durumda: yukseklik = int(input("Yükseklik: "))

Bu satır ne işe yarar?

Yükseklik: yazdırır, kullanıcının bir sayı yazmasını bekler ve sayıyı yukselik tamsayı değişkenine atar.

Bir sonraki çalışan satır nedir?

Genel olarak, bir sonraki satır bir aşağıdaki satırdır: genislik = int(input("Genislik: "))

Bu satır ne işe yarar?

Genişlik: yazdırır, kullanıcının bir sayı yazmasını bekler ve kullanıcının yazdıklarını bir değişkene atar.

Bir sonraki çalışan satır nedir?

Bir sonraki satır geçerli satırdan daha fazla veya daha az girintili olmadığında, geçerli satırdan hemen bir sonraki satır olacaktır. Bu nedenle: print("çevre =", genislik + yukseklik + genislik + genislik) çalıştırılır.

Bu satır ne işe yarar?

Önce çevre = yazdırır, sonra değişkenlerin içerdiği değerlerin toplamını genislik + yukseklik + genislik + genislik formülünden yazdırır.

Çevre doğru hesaplanıyor mu?

Bir bakalım; bir dikdörtgenin çevresi alt (genişlik) artı sol taraf (yükseklik) artı üst (genişlik) artı sağ taraftır (yani?). Yani doğru sonucun olması için kullandığımız formülde son öğe sağ tarafın uzunluğu veya yüksekliği olmalıdır.

Çevrenin bazı durumlarda neden “doğru” hesaplandığını anlıyor musunuz?

Genişlik ve yükseklik eşit olduğunda doğru hesaplandı.

Bir sonraki programa bakalım.

sayi = 5
while sayi > 1:
    print(".",end=" ")
    sayi = sayi - 1
print()

Bu program, artık girintili bölümlere (veya kontrol yapılarına) sahip olduğundan izlenecek yol daha karmaşık olacaktır. Hadi başlayalım.

Çalıştırılacak ilk satır nedir?

Dosyanın ilk satırı: sayi = 5

Ne işe yarıyor?

5 sayısını değişkene atıyor.

Sıradaki satır ne?

Bir sonraki satır: while sayi > 1:

Ne işe yarıyor?

Genel olarak while döngüleri kendi ifadelerini kontrol ederler ve bu ifade eğer doğruysa bir sonraki girintili kod bloğunu çalıştırırlar. Aksi takdirde girintili kod bloğunu atlarlar.

Peki şu anda ne yapıyor?

sayi > 1 değeri True ise, sonraki iki satır çalıştırılır.

Peki sayi > 1‘mi?

sayi değişkenine atadığımız son değer 5’tir ve bu durumda sayi > 1 olur.

Peki sıradaki satır nedir?

while ifadesi True olduğu için bir sonraki satır: print(".",end=" ")

Bu satır ne işer?

Bir nokta yazdırır ve end=" " ifadesi sebebiyle bir sonraki yazdırılan metnin aynı ekran satırında olmasını sağlar.

Sıradaki satır ne?

sayi = sayi - 1 satırıdır. Çünkü bir aşağıdaki satır bu satırdır ve girinti değişikliği yoktur.

Ne işe yarıyor?

sayi‘nin geçerli değerini hesaplar. Değişkenden 1 çıkartır ve bunu sayının yeni değeri yapar. Yani temel olarak değişkenin değerini 5’ten 4’e değiştiriyor.

Sıradaki satır ne?

Girinti seviyesi düşüyor, bu yüzden ne tür bir kontrol yapısı ile karşı karşıya olduğumuza bakmalıyız. Bu bir döngü olduğuna göre ilk maddeye geri dönmeliyiz. 

Ne işe yarıyor?

sayı‘nın değerine bakar (4). Bu değeri 1 ile karşılaştırır: 4 > 1 olduğu için while döngüsünü devam ettirir.

Sıradaki satır ne?

While döngüsü doğru olduğundan, bir sonraki satır: print(".",end=" ")

Ne işe yarıyor?

Satıra ikinci bir nokta yazdırır ve boşlukla bitirir.

Sıradaki satır ne?

Girinti değişikliği yok, bu yüzden: sayi = sayi - 1

Peki ne işe yarıyor?

Sayının (4) geçerli değerini alır, ondan 1 çıkarır, bu da 3’ü verir. Son olarak 3’ü sayının yeni değeri yapar.

Sıradaki satır ne?

While döngüsünün sonundan kaynaklanan bir girinti değişikliği olduğundan, bir sonraki satır: while sayi > 1:

Ne işe yarıyor?

Sayının (3) geçerli değerini 1 ile karşılaştırır. böylece while döngüsü devam eder. 3 > 1

Sıradaki satır ne?

While döngüsü koşulu doğru olduğundan, bir sonraki satır: print(".",end=" ")

Peki ne yapıyor?

Satıra üçüncü bir nokta yazdırır.

Sıradaki satır ne?

Bu: sayi = sayi - 1

Ne işe yarıyor?

Sayının geçerli değerini (3) alır, 1 çıkartır ve 2’yi sayının yeni değeri yapar.

Sıradaki satır ne?

While döngüsünün başlangıcına dönüş: while sayi > 1:

Ne işe yarıyor?

Sayının (2) geçerli değerini 1 ile karşılaştırır. While döngüsü devam etti. 2 > 1

Sıradaki satır ne?

While döngüsü devam ettiği için: print(".",end=" ")

Ne işe yarıyor?

Hayatın, evrenin ve her şeyin anlamını keşfeder. Şaka yapıyorum. (Uyanık olduğundan emin olmak zorundaydım.) Ekranda dördüncü bir nokta yazdırır.

Sıradaki satır ne?

Bu: sayi = sayi - 1

Ne işe yarıyor?

Sayının geçerli değerini alır (2), 1 çıkarır ve 1’i sayının yeni değeri yapar.

Sıradaki satır ne?

While döngüsünün başına dönüş: while sayi > 1:

Ne işe yarıyor?

Sayının (1) geçerli değerini 1 ile karşılaştırır, 1 > 1. Bu ifade False olduğundan (biri birden büyük değildir), while döngüsünden çıkar.

Sıradaki satır ne?

While döngüsü koşulu yanlış olduğundan, sonraki satır while döngüsü çıktıktan sonraki satırdır, yani: print()

Bu satır ne işe yarar?

Ekranın bir sonraki satıra gitmesini sağlar.

Program neden 5 nokta yazdırmıyor?

Döngüden 1 nokta öncesinde çıkılıyor.

Bunu nasıl düzeltebiliriz?

Döngüden 1 nokta sonra çıkın.

Peki bunu nasıl yapacağız?

Birkaç yolu var. Birinci yol, while döngüsünü değiştirmek olacaktır: while sayi > 0. Başka bir yol koşulu değiştirmek olacaktır: sayi >= 1. Birkaç tane daha kendiniz bulabilir misiniz?

Programımı nasıl düzeltebilirim? 

Programın ne yaptığını bulmalısınız. Programın ne yapması gerektiğini bulmalısınız. İkisi arasındaki farkı bulmalısınız. Hata ayıklama, ancak uygulandığında öğrenilen bir beceridir. Sorunu bir saat içinde çözemiyorsanız, bir mola verin. Sorun hakkında biriyle konuşun veya göbeğinizdeki tiftiği düşünün. Bir süre sonra geri gelin, muhtemelen sorun hakkında yeni fikirleriniz olacaktır. İyi şanslar.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top