본문으로 이동

프로그래머가 아닌 이들을 위한 파이썬 3 자습서/디버깅

위키책, 위키책

디버깅(Debugging)이란 무엇인가?

[+/-]
"우리가 프로그래밍을 시작했을 때, 우리가 생각했던 것처럼 프로그램을 만드는 것이 쉽지 않다는 것을 발견할 수 있었다. 디버깅이란 발견해야 하는 것이다. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs." — Maurice Wilkes discovers debugging, 1949

By now if you have been messing around with the programs you have probably found that sometimes the program does something you didn't want it to do. This is fairly common. Debugging is the process of figuring out what the computer is doing and then getting it to do what you want it to do. This can be tricky. I once spent nearly a week tracking down and fixing a bug that was caused by someone putting an x where a y should have been.

이번 장은 지난 장들에 비해 좀더 추상적일 것이다.

프로그램은 무엇을 해야 하는가?

[+/-]

The first thing to do (this sounds obvious) is to figure out what the program should be doing if it is running correctly. Come up with some test cases and see what happens. For example, let's say I have a program to compute the perimeter of a rectangle (the sum of the length of all the edges). I have the following test cases:

가로 세로 둘레
4 3 14
3 2 10
4 4 16
2 2 8
1 5 12

I now run my program on all of the test cases and see if the program does what I expect it to do. If it doesn't then I need to find out what the computer is doing.

More commonly some of the test cases will work and some will not. If that is the case you should try and figure out what the working ones have in common. For example here is the output for a perimeter program (코드는 잠시 후에 보게될 ㅓㅂ니다):

가로: 4
세로: 3
둘레 = 15
가로: 3
세로: 2
둘레 = 11
가로: 4
세로: 4
둘레 = 16
가로: 2
세로: 2
둘레 = 8
가로: 1
세로: 5
둘레 = 8

처음 두 개의 입력은 제대로 작동하지 않았고, 그 다음 두 개는 제대로 작동했으며, 마지막 입력은 제대로 작동하지 않았다는 것을 확인할 수 있다. 제대로 작동한 것들의 공통점이 무엇인지 알아내라. 문제가 무엇인지에 대한 원인을 찾는 몇 가지 아이디어만 있다면 더 쉬워진다. 만약 필요하다면 당신은 여라 가지 케이스를 좀더 시험해보아야 한다.

프로그램은 무엇을 해야 합니까?

[+/-]

다음으로 해야 하는 것은 소스 코드를 보는 것이다. 프로그래밍을 하는 동안 해야 하는 가장 중요한 것은 소스 코드를 읽는 것이다. 그러기 위한 우선적인 방법은 코드의 검토(code walkthrough)이다.

코드의 검토는 첫줄부터 그 프로그램이 끝날 때까지 밑으로 읽어가는 것이다. while 루프들과 if 조건문들은 실행되지 않는 것들도 있고 여러 번 반복되는 것들도 있다. 당신은 매 줄마다 파이썬이 무엇을 했는지 확인하여야 한다.

간단한 둘레계산 프로그램부터 시작하겠다. 당신은 이것을 타이핑하지도, 실행하지도 말고 그저 읽기만 해라. 소스 코드는 다음과 같다:

width = int(input("가로: "))
height = int(input("세로: "))
print("둘레 =", width + height + width + width)
질문: 파이썬이 실행하는 첫 번째 줄은 무엇인가?
해답: 첫 번째 줄은 항상 처음으로 실행된다. 이 경우에는: width = int(input("가로: "))
그 줄이 하는 일은 무엇인가?
가로: 를 출력한 후, 사용자가 문자를 입력할 때까지 기다린 후, 문자를 정수 변수 width에 맞게 변환하여 넣는다.
그 다음 실행되는 줄은 무엇인가?
일반적으로, 바로 밑의 줄이다, 이 경우에는 다음과 같다: height = int(input("세로: "))
그 줄이 하는 일은 무엇인가?
세로: 를 출력한 후, 사용자가 문자를 입력할 때까지 기다린 후, 문자를 정수 변수 height에 맞게 변환하여 넣는다.
그 다음 실행되는 줄은 무엇인가?
그 다음 줄이 현재의 줄보다 들여쓰기 혹은 내어쓰기가 되어있지 않다면, 그것은 바로 다음에 오는 줄이다, 그래서: print("둘레 = ", width + height + width + width) (현재 줄에 있는 함수를 실행할 수도 있지만, 그것은 나중의 장에 나온다.)
그 줄이 하는 일은 무엇인가?
우선 둘레 = 를 출력하고, width + height + width + width식에서 widthheight변수들이 지닌 값들의 합을 출력한다,
width + height + width + width 이 둘레를 적절히 계산하는가?
음, 사각형의 둘레는 아랫변(가로) 더하기 좌변(세로) 더하기 윗변(가로) 더하기 우변(세로)이다 (아닌가?). 그렇다면 마지막 항목은 우변의 길이, 즉 세로가 되어야 할 것이다.
왜 간혹 둘레가 "올바르게" 계산되었던 것인가?
가로와 세로가 같았을 때 올바르게 계산되었다.

코드 검토를 해 볼 다음 프로그램은 화면에 점("."; dot")을 5개 출력하도록 만든 것이다. 그러나 프로그램은 다음과 같이 출력하였다:

. . . . 

그 프로그램은 다음과 같다:

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

이 프로그램은 들여쓰기된 부분(제어구조)을 가지므로 검토하기에는 좀 더 복잡하다 . 시작하자.

실행되는 첫 줄은 무엇인가?
파일의 첫 줄: number = 5
그것은 무엇을 하는가?
변수 number에 5를 넣는다.
다음 줄은 무엇인가?
다음줄: while number > 1:
그것은 무엇을 하는가?
자, while 구문은 일반적으로 자신의 표현식을 살펴본 후, 그것이 참(true)이면 다음에 오는 코드의 들여쓰기된 블록을 실행하고, 그렇지 않으면 다음에 오는 코드의 들여쓰기된 블록을 건너뛴다.
그래서 그것은 지금 무엇을 하는가?
만약 number > 1 이 참(true)이면 다음에 오는 두 줄이 실행된다.
그래서 number > 1인가?
number에 들어간 최근값은 5였으므로 5 > 1이므로 맞다.
그러면 다음 줄은 무엇인가?
while구문이 참이었으므로 다음줄은: print(".",end=" ")
그 줄은 무엇을 하는가?
한 개의 점을 출력하고 마지막 인수로 end=" "가 존재하므로 다음에 출력될 텍스트는 다른 줄에 출력되지 않는다.
다음 줄은 무엇인가?
바로 다음에 오고 어떠한 들여쓰기의 변화가 없기 때문에 number = number - 1이다.
그것은 무엇을 하는가?
number - 1을 계산한다, number의 현재값 (5) 에서 1을 차감한 후, number 변수의 새 값으로 만든다. 그래서 기본적으로 number의 값은 5에서 4로 바뀐다.
다음 줄은 무엇인가?
여기서, 들여쓰기 수준이 감소하므로 우리는 제어구조의 형태(type)를 보아야 한다. 그것이 while 루프이기 때문에, 우리는 반드시 while 절(while number > 1:)로 되돌아가야 한다.
그것은 무엇을 하는가?
number 변수의 값(4)에서 1과 비교한다. 4 > 1이므로 while 루프는 계속된다.
What is the next line?
while루프가 참이었으므로 다음줄은: print(".",end=" ")
그것은 무엇을 하는가?
출력된 줄에 두번째 점을 찍고 , 공백으로 출력을 종료한다.
What is the next line?
들여쓰기에 변화가 없으므로 이것이다: number = number - 1
그리고 그것은 무엇을 하는가?
number의 현재값(4)에서, 1을 차감하여, 3을 도출하고 number의 새 값으로 3을 대입한다.
다음 줄은 무엇인가?
while루프의 종료로 들여쓰기에 변화가 생기므로, 다음 줄은: while number > 1:
그것은 무엇을 하는가?
number의 현재값(3)을 1과 비교한다. 3 > 1 이므로 while 루프는 계속된다.
다음 줄은 무엇인가?
while루프의 조건이 참이었으므로 다음줄은: print(".",end=" ")
그리고 그것이 무엇을 하는가?
출력된 줄에 세 번째 점을 찍는다.
다음 줄은 무엇인가?
이것이다: number = number - 1
그것은 무엇을 하는가?
number의 현재값(3) 에서 1을 차감한 후 2를 number의 새로운 값으로 대입한다.
다음 줄은 무엇인가?
while루프의 처음으로 되돌아간다: while number > 1:
그것은 무엇을 하는가?
number의 현재값(2)과 1을 비교한다. 2 > 1이므로 while 루프는 계속된다.
다음 줄은 무엇인가?
while 루프가 계속되고 있다: print(".",end=" ")
그것은 무엇을 하는가?
그것은 삶, 우주, 그리고 모든 것에 대한 의미를 발견한다. 농담이다. (나는 당신이 깨어 있기를 바랬다.) 화면에 네 번째 점을 출력한다.
다음 줄은 무엇인가?
이것이다: number = number - 1
그것은 무엇을 하는가?
number의 현재값(2)에서 1을 차감한 후 number의 새로운 값으로 1을 대입한다.
다음 줄은 무엇인가?
while루프로 되돌아간다: while number > 1:
그 줄은 무엇을 하는가?
number의 현재값(1)과 1을 비교한다. 1 > 1은 거짓(false)이기 때문에 (1은 1보다 크지 않다), while 루프는 종료한다.
다음 줄은 무엇인가?
while 루프의 조건이 거짓(false)이었으므로 다음 줄은 while 루프의 종료 다음이다, 즉: print()
그 줄은 무엇을 하는가?
화면에 다음줄로 간다.
왜 프로그램이 다섯 개의 점을 출력하지 못했나?
루프가 1개의 점을 출력하기 전에 종료했다.
우리는 어떻게 그것을 고칠 수 있는가?
루프가 점 하나 더 출력하고 종료하게 하면 된다.
그리고 그것을 어떻게 하는가?
여러가지 방법이 있다. 하나는 while 루프를 고치는 것이다: while number > 0: 다른 방법은 연산자를 고치는 방법도 있다: number >= 1 다른 방법들도 많다.

내 프로그램을 어떻게 고쳐야 하나요?

[+/-]

당신은 프로그램이 무엇을 하고 있는지 알아야 한다. 당신은 프로그램이 무엇을 해야 하는지 알아야 한다. 두 문장간의 차이점이 무엇인지 알아보라. 디버깅은 배우고 실천되어야 하는 기술이다. 1시간이 지나도 문제를 알아낼 수 없다면, 휴식을 취하고, 그 문제에 관하여 다른 사람들과 이야기하거나 contemplate the lint in your navel. 다시 돌아오면 당신은 아마 그 문제에 관한 새로운 아이디어들을 얻을 수 있을 것이다. 행운을 빈다.

틀:Navigation 스크립트 오류: "TScope" 모듈이 없습니다.