Tutorial Python untuk bukan pengatur cara/Nyahpepijat


Seterusnya, nyahpepijat.

"Sebaik sahaja kami mula mengatur cara, kami terkejut dan mendapati bahawa tidak mudah bagi mendapat pengaturcaraan yang betul seperti kami sangkakan. Nyahpepijat perlu ditemui. Saya masih ingat waktu persis apabila saya mendapati bahawa sebahagian besar hayat saya akan diluangkan mencari kesilapan dalam atur cara saya sendiri." — Maurice Wilkes discovers debugging, 1949

Apakah itu nyahpepijat?

sunting

Pada ketika ini, jika anda menyemak atur cara anda, anda mungkin akan mendapati bahawa atur cara yang anda buat itu kadang-kadang tidak mengikut apa yang anda mahukan. Ini perkara biasa. Nyahpepijat (debugging) ialah satu proses memahami apa yang komputer sedang lakukan dan kemudian membuatkannya melakukan apa yang anda inginkan pula.

Bab ini akan lebih abstrak dari bab-bab terdahulu.

Apa yang sepatutnya atur cara lakukan?

sunting

Perkara pertama yang perlu dilakukan ialah untuk memahami apa yang seharusnya atur cara itu lakukan jika ia berjalan dengan betul. Mari hasilkan beberapa kes ujian dan lihat apa yang berlaku. Sebagai contoh, katakan saya ada sebuah atur cara yang akan mengira perimeter segi empat (jumlah panjang setiap sisi keliling). Saya mempunyai kes ujian berikut:-

Lebar Tinggi Perimeter
3 4 14
2 3 10
4 4 16
2 2 8
5 1 12

Sekarang saya jalankan atur cara saya pada semua kes ujian dan lihat jika atur cara ini melakukan apa yang saya jangkakan. Jika ia tidak membuat apa yang saya mahukan, saya akan siasat apa yang ia lakukan.

Kebiasaanya, beberapa ujian akan berfungsi dan selebihnya tidak. Jika inilah kesnya, anda mesti mencuba menggambarkan apa yang dibuat. Sebagai contoh, ini adalah output/hasil bagi sebuah program perimeter:-

Tinggi: 3
Lebar: 4
perimeter = 15
Tinggi: 2
Lebar: 3
perimeter = 11
Tinggi: 4
Lebar: 4
perimeter = 16
Tinggi: 2
Lebar: 2
perimeter = 8
Tinggi: 5
Lebar: 1
perimeter = 8

Perhatikan bahawa ia tidak berfungsi dengan betul pada dua input yang pertama. Ia berfungsi pada dua yang seterusnya dan tidak berfungsi pada yang akhir sekali. Cuba gambarkan apa yang dibuat, cari pola. Mencari sendiri punca masalah itu adalah lebih mudah jika anda mempunyai idea apa yang mungkin silap.

Apa yang atur cara buat?

sunting

Perkara seterusnya adalah melihat kod sumbernya. Salah satu daripada perkara yang terpenting ketika mengaturcara ialah membaca kod sumbernya.

Sesuatu kod berjalan dengan bermula pada baris pertama, dan bergerak ke bawah sampai atur cara habis dijalankan. Gelung while dan penyataan if bermaksud beberapa baris mungkin tak akan dijalankan dan sesetengahnya pula akan dijalankan banyak kali. Pada setiap baris, anda bayangkan apa yang Python buat.

Mari kita mulakan dengan atur cara perimeter mudah ini. Jangan taip ini, anda akan membacanya, bukan menjalankannya. Kod sumbernya ialah:

tinggi = input("Tinggi: ")
lebar = input("Lebar: ")
print "perimeter =", lebar + tinggi + lebar + lebar
Soalan: Apakah baris pertama yang dijalankan Python?
Jawapan: Baris pertama sentiasa dijalankan dahulu. Di dalam kes ini: tinggi = input("Tinggi: ")
Soalan: Apa yang baris itu buat?
Jawapan: Cetak Tinggi: , menunggu pengguna untuk memasukkan nombor, dan memasukkannya ke dalam pemboleh ubah "tinggi".
Soalan: Apakah baris yang dijalankan seterusnya?
Jawapan: Secara umumnya, ia adalah baris seterusnya yang merupakan: lebar = input("Lebar: ")
Soalan: Apa yang baris itu buat?
Jawapan: Cetak Lebar: , menunggu pengguna untuk memasukkan nombor, dan memasukkannya ke dalam pemboleh ubah "lebar".
Soalan: Apakah baris yang dijalankan seterusnya?
Jawapan: Jika baris seterusnya tidak diengsot lebih atau kurang daripada baris yang sedia ada, ia adalah baris yang akan dijalankan, jadi: print "perimeter =", lebar + tinggi + lebar + lebar (Ia boleh juga menjalankan fungsi dalam baris semasa, tetapi itu dari bab akan datang.)
Soalan: Apa yang baris itu buat?
Jawapan: Pertama, ia mencetak perimeter = , kemudian ia mencetak nilai lebar + tinggi + lebar + lebar.
Soalan: Adakah lebar + tinggi + lebar + lebar mengira perimeter dengan betul?
Jawapan: Mari lihat, perimeter segi empat ialah bawah (lebar) campur sisi kiri (tinggi) campur yang atas (lebar) campur sisi kanan (hah?). Hal terakhir seharusnya panjang sebelah kanan atau ketinggiannya.
Soalan: Adakah anda fahami mengapa sesetengah kiraan perimeter dikira dengan "betul"?
Jawapan: Ia dikira dengan betul apabila lebar dan tinggi adalah sama.

Atur cara seterusnya yang akan kita teliti ialah untuk suatu atur cara yang sepatutnya memaparkan 5 titik pada skrin. Bagaimanapun, ini ialah apa yang atur cara outputkan:-

. . . . 

Dan ini adalah kodnya.

nombor = 5
while nombor > 1:
    print ".",
    nombor = nombor - 1
print

Atur cara ini akan menjadi lebih kompleks untuk diteliti kerana ia mempunyai struktur kawalan (bahagian berengsot). Mari kita mulakan:

Apakah baris pertama yang akan dijalankan?
Baris pertama fail: nombor = 5
Apa yang ia buat?
Memasukkan nombor 5 ke dalam pemboleh ubah nombor.
Apakah baris seterusnya?
Baris seterusnya ialah: while nombor > 1:
Apa yang ia buat?
Penyataan while secara amnya melihat pada ungkapannya dan jika ia benar, komputer akan menjalankan blok kod berengsot seterusnya, jika tidak blok kod berengsot tersebut akan dilangkau.
Apa yang sepatutnya ia buat sekarang?
Jika nombor > 1 benar, maka dua baris seterusnya akan berjalan.
Jadi adakah number > 1?
Nilai terakhir dimasukkan kepada nombor ialah 5 dan 5 > 1 jadi ya.
Jadi, apakah baris seterusnya?
Memandangkan while benar, baris seterusnya ialah: print ".",
Apa yang baris itu buat?
Mencetak satu titik dan oleh sebab penyataan itu berakhir dengan ',' penyataan print seterusnya tidak akan berada di baris skrin berbeza.
Apakah baris seterusnya?
nombor = nombor - 1 kerana ia baris seterusnya dan tiada perubahan dalam engsotan.
Apa yang ia buat?
Ia mengira nombor - 1, iaitu nilai terkini nombor (atau 5) ditolak dengan 1, dan menjadikan nilai tersebut nilau baharu buat nombor. Jadi, pada asasnya ia menukar nilai nombor daripada 5 kepada 4.
Apakah baris seterusnya?
Tahap engsotan berubah, jadi kita perlu lihat apakah jenis struktur kawalan tersebut. Ia merupakan gelung while, jadi kita perlu kembali ke klausa while iaitu while nombor > 1:
Apa yang ia buat?
Ia melihat kepada nilai nombor, iaitu 4, dan membandingkannya dengan 1 dan disebabkan 4 > 1, gelung while terus berjalan.
Apakah baris seterusnya?
Oleh sebab gelung while masih benar, baris seterusnya ialah: print ".",
Apa yang ia buat?
Ia mencetak titik kedua pada baris tersebut.
Apakah baris seterusnya?
Tiada perbezaan engsotan, jadi: nombor = nombor - 1
Dan apa yang ia buat?
Ia mengambil nilai semasa nombor (4), tolak 1 daripadanya, memberikan nilai 3 yang kemudian disimpan sebagai nilai terbaru nombor.
Apakah baris seterusnya?
Memandangkan terdapat perubahan engsotan yang disebabkan oleh gelung while berakhir, baris seterusnya ialah: while nombor > 1:
Apa yang ia buat?
Ia membandingkan nilai semasa nombor (3) dengan 1. 3 > 1 jadi gelung while akan diteruskan.
Apakah baris seterusnya?
Disebabkan syarat gelung while masih benar, baris seterusnya ialah: print ".",
Dan apa yang ia buat?
Titik ketiga dicetak di baris tersebut.
Apakah baris seterusnya?
nombor = nombor - 1
Apa yang ia buat?
Ia mengambil nilai semasa nombor (3), tolak 1 daripadanya dan menyimpan 2 sebagai nilai baharu nombor.
Apakah baris seterusnya?
Kembali ke permulaan gelung while: while nombor > 1:
Apa yang ia buat?
Ia membandingkan nilai semasa nombor (2) dengan 1. Oleh sebab 2 > 1 gelung while akan berterusan.
Apakah baris seterusnya?
Oleh sebab gelung while diteruskan: print ".",
Apa yang ia buat?
Ia menemui makna kehidupan, dunia dan segalanya. Saya buat lawak. (Saya kena pastikan yang anda masih jaga). Baris itu mencetak titik ke empat pada skrin.
Apakah baris seterusnya?
nombor = nombor - 1
Apa yang ia buat?
Mengambil nilai semasa nombor (2), tolak 1 daripadanya dan menjadikan 1 nilai nombor yang baharu.
Apakah baris seterusnya?
Kembali ke gelung while: while nombor > 1:
Apa yang baris itu buat?
Ia membandingkan nilai semasa nombor (1) dengan 1. Oleh sebab 1 > 1 tidak benar (satu tidak lebih besar daripada satu), gelung while ditamatkan.
Apakah baris seterusnya?
Disebabkan syarat gelung while tidak lagi benar, baris seterusnya ialah baris selepas tamatnya gelung tersebut, iaitu: print
Apa yang baris itu buat?
Menggerakkan skrin pergi ke baris seterusnya.
Kenapa atur cara ini tidak mencetak 5 titik?
Gelung itu tamat 1 titik lebih cepat.
Bagaimana ini boleh diperbaiki?
Buatkan supaya gelung tersebut tamat 1 titik kemudian.
Dan bagaimana kita dapat melakukannya?
Terdapat beberapa cara. Satu cara ialah menukar gelung while kepada: while nombor > 0:. Cara lain pula ialah dengan menukar syarat kepada: nombor >= 1:.

Bagaimana memperbaikinya?

sunting

Anda perlu memahami apa yang dibuat atur cara tersebut. Anda juga perlu memahami yang yang sepatutnya ia buat. Seterusnya fahami perbezaan antara keduanya. Nyahpepijat merupakan suatu kemahiran yang perlu dilatih untuk dipelajari. Selamat berjaya.