[파이썬 프로그래밍 07] while 기본 사용법

Home / 파이썬 프로그래밍 / [파이썬 프로그래밍 07] while 기본 사용법
while 기본 사용법

먼저 if 에 대한 사용법을 짧게 복습해보겠습니다.

if a==b :
    a = a+1
    b = b+1
else :
    a = a-1
    b = b-1
sum = a+1

만약에 a와 b가 같은 값을 지니면 a==b는 True(참)라는 결과를 내놓습니다. 그러면 if 다음에 들여쓰기한 작업을 합니다. else : 다음에 들여쓰기한 작업은 건너 뜁니다.
만약에 a와 b가 다른 값을 지니면 a==b는 False(거짓)라는 결과를 내놓습니다. 그러면 if 다음에 들여쓰기한 건너 뛰고, else : 다음에 들여쓰기 한 작업을 합니다.

a와 b에 똑같이 2가 저장되어 있으면, a==b는 True(침)라는 결과를 내보내므로 if 다음의 작업을 해 a와 b에는 원래 값에 1을 더한 3이 저장 됩니다. 그리고 if else를 벗어난 마지막 작업의 결과로 sum에는 3+3의 결과인 6이 저장됩니다.

a에는 2와 b에는 3이 저장되어 있으면, a==b는 False(거짓)라는 결과를 내보내므로 else 다음의 작업을 해 a와 b에는 원래 값에 1을 뺀 1과 2가 저장 됩니다. 그리고 if else를 벗어난 마지막 작업의 결과로 sum에는 1+2의 결과인 3이 저장됩니다.

while는 사용방법만 따지면 if와 거의 같습니다. else를 쑈지 않는 것이 다른점입니다.(다루지는 않았지만 elif도 쓰지 않습니다). 예를 들면 다음과 같은 방법으로 while을 사용합니다.

n = 1
while n<=10 :
    n = n+1
print(n)

if 와 다른점은 while 다음에 들여쓰기한 작업을 계속 반복한다는 것입니다. 작업을 반복할때마다 while 옆의 결과가 True인지 False인지 확인해서 False(거짓)일때 반복하는 것을 중단합니다. 위의 코드는 처음에 n에 1을 저장하고 n가 10과 같거나 작을때까지 원래 n값에 1을 더해 n에 저장하는 작업을 반복합니다.

여기에서 마지막 작업을 유심히 봐야합니다. n에 10이 저장되어 있다면 n<=10은 True(참)의 결과를 내보내므로 n = n+1 작업을 합니다. a에는 10+1의 결과인 11이 저장되고 다시 while이 있는 줄에서 n<=10을 확인합니다. 11은 10보다 크므로 더 이상 while 밑에 들여쓴 작업은 더 이상 하지 않고 벗어납니다.

마지막에 print(a) 는 “n값을 화면에 프린트하라”는 작업을 합니다. 결국 위의 코드는 처음에 n에 1을 저장한 후 점점 그 값을 늘려 11이 될때 까지 n = n+1 (n에 1을 더해 다시 n에 저장) 을 반복합니다.

만약에 위의 코드에서 while을 if로 바꾸면 어떻게 될까요?

n = 1
if n<=10 :
    n = n+1
print(n)

1은 10보다 작아서 n<=10은 True(참)의 결과를 내놓기 때문에 if 밑에 들여쓴 n=n+1작업을 한번만 합니다. 마지막줄에서 n의 값인 2를 프린트 합니다.

while과 같이 반복하는 것을 프로그래밍하는 것이 프로그래밍을 하는 중요한 이유중에 하나입니다. 사람은 반복되는 일을 하면서 중간에 실수도 하고 지겨워서 잠시 쉬기도 합니다. 하지만 컴퓨터는 정확하게 프로그래밍만 해두면 실수 없이 그리고 지치는 것도 없이 작업을 계속 수행합니다. 단 프로그래밍이 제대로 됐다는 가정하에서 입니다.

while을 쓴 코드를 살짝만 응용해 보겠습니다.

n = 1
sum = 0
while n<=10 :
    sum = sum+n
    n = n+1
print(sum)

n값에 1씩 더해지기 전에 sum이라는 변수에 n값을 더합니다. 이걸 n가 10일때까지 합니다. 다시말해 sum에는 1+2+…+9+10의 결과가 저장됩니다. 수학으로 표현하면

$$\sum_{n=1}^{10} n$$

가 되겠습니다.

sum = sum+n줄과 n = n+1줄을 바꿔보죠.

n = 1
sum = 0
while n<=10 :
    n = n+1
    sum = sum+n
print(sum)

sum에 더하기전에 먼저 n에 저장된 값에 1을 더합니다. 맨처음 sum에 더하는 값이 2가 됩니다. 그리고 맨 마지막으로 while 다음이 True(참)일때는 n이 10일때입니다. 이때도 n에 1을 더한 다음 sum에 n값을 더해 다시 sum에 저장하므로 마지막에 sum에 더하는 숫자는 11입니다. 결국 화면에 프린트하는 sum의 값은 2+3+…+10+11의 결과입니다.수학으로 표현하면

$$\sum_{n=2}^{11} n = \sum_{n=1}^{10} (n+1)$$

가 되겠습니다.

그러면 $$1^2+2^2+ … +9^2+10^2= \sum_{n=1}^{10} n^2$$ 은 어떻게 프로그래밍할까요?

n = 1
sum = 0
while n<=10 :
    sum = sum+n*n
    n = n+1
print(sum)

과 같이 프로그래밍하면됩니다. 프로그래밍에서도 사칙연산의 계산순서, 다시 말해 괄호가 있지 않으면 곱셈이나 덧셈을 먼저 하고 그 다음에 덧셈과 뺄셈을 하는 규칙이 그대로 적용됩니다.

sum = sum+n*n

에서도 n*n을 먼저 하고 그 결과를 sum에 더한 다음 다시 sum에 저장합니다.

프로그램을 하는 사람에 따라 위의 코드대신 다음과 같은 코드를 쓰기도 합니다.

n = 0
sum = 0
while n<10 :
    n=n+1
    sum = sum+n*n
print(sum)

결과는 같습니다.

그런데 수학을 좀 하는 사람은 이쯤에서 뭣하러 while과 같이 반복하는 코드를 프로그래밍하냐고도 할 수 있습니다. 수학에 나오는 공식

$$\sum_{k=1}^{n} k = \frac{n(n+1)}{2}$$

$$\sum_{k=1}^{n} k^2 = \frac{n(n+1)(2n+1)}{6}$$

을 쓰면되지 않냐고 주장할 수 있습니다. 맞는 얘기입니다.

하지만 프로그래밍을 배우는 사람에게는 이런 걸 하나 하나 프로그래밍을 해보는 과정을 거쳐야 합니다. 그래야지 프로그래밍 중에 할 수 있는 실수도 줄일 수 있고 프로그래밍 감각도 좋아집니다.

그리고 남들이 해봤을텐데 뭣하러 나까지 이런 걸 반복해 프로그래밍을 해보냐 하는 사람들도 있습니다. 그런 말 하는 사람치고 나중에 프로그래밍을 제대로 하는 사람들도 별로 못 봤습니다. 프로그래밍을 본인이 직접 해봐야 실력이 늡니다. 설령 안해봐도 뻔한 것까지도요. 특히 본인이 직접 문제를 찾아 프로그래밍도 직접 해볼때 실력이 잘 늡니다.