while 기본 사용법 2 – 무한 반복에서 빠져 나오기
while을 이용하면 작업을 무한히 반복하게 할 수 있습니다. 물론 영원히 반복한다는 것은 사실상 불가능합니다. 컴퓨터의 수명이 있으니까요. 가정에서 사용하는 컴퓨터라면 정전이 돼서 컴퓨터가 작동을 멈출 수도 있는 거고, 운영체제 업테이트하려고 재시작(restart)해야 할 수 도 있으니까요.
실제 프로그래밍할때도 무한히 작업을 반복하지는 않고 특정 조건이 맞으면 작업을 반복하는 것을 멈추는 코드가 들어갑니다. 일단 무한히 작업을 반복하게 만들어놓고 필요에 따라 반복작업을 멈추는 겁니다.
일단 먼저 무한히 반복하는 코드를 프로그래밍해보겠습니다. 그런데 여기에서 미리 무한 반복작업을 강제로 중지하는 방법을 미리 알고 난 다음에 프로그래밍을 해야합니다. 중간에 중지하지 않고 너무 오랫동안 반복 작업을 돌리면 문제가 생기기도 하기 때문입니다. jupyter notebook을 사용한다고 가정하고 그 방법을 알아보겠습니다.
가장 간단한 방법은 jupyter notebook창이 떠있는 웹브라우저를 아얘 닫아버리는 방법이 있습니다. 다른 프로그래밍을 할려면 다시 jupyter notebook을 실행해야하겠습니다.
두번째 방법은 jupyter notebook창의 메뉴에 보면 kernel이라는 메뉴가 있습니다. 이 메뉴안에 interrupts라는 하부 메뉴가 있습니다. 이 메뉴를 클릭하면 무한히 돌아가는 작업이 멈춥니다.
무한히 돌아가는 작업을 강제로 멈추는 작업을 알았으니, 이 본격적으로 while을 써서 무한히 반복하는 코드를 프로그래밍해 보겠습니다.
a=100.0 while True : a = a/2 print(a) print("end of program")
위의 코드는 처음에 a라는 변수에 100.0이라는 숫자를 저장합니다. 이때 정수가 아닌 실수임을 나타내기위해 100뒤에 .0을 붙였습니다. 다음 줄에 나오는 while True :를 보겠습니다. while 다음에 오쓴 표현이 True(참)이면 계속 반복합니다. 위의 코드에서는 아얘 때에 따라 결과가 변하는 표현이 아닌 변하지 않는 값 True를 그냥 써 버렸습니다. 변하지 않는 True값이 while 다음에 왔으므로, 그 다음에 들여쓰기한 두 줄에 쓴 작업을 무한히 반복합니다.
위의 코드를 입력한 다음 Shift-Enter를 치면, 맨 처음에 어떤 숫자를 잠시 출력하다가 이내 0을 계속 출력할 것입니다. 이제 위에서 말한 무한 반복 작업을 강제로 멈추는 두번째 방법인 kernle => interrupts 메뉴를 클릭해 계속 출력하는 것을 멈추겠습니다.
강제로 멈춘후에 결과를 출력한 박스의 스크롤 바를 맨 처음으로 올려 어떤 값들이 출력됐는지 보겠습니다.
들여쓰기한 첫번째 줄은 이전 a값을 2로 나눈 값을 다시 a에 저장합니다. 들여쓰기한 두번째 줄은 a값을 출력합니다. 이 두작업을 무한히 반복하는 겁니다. 맨 처음에 a에는 100.0이 저장되어 있으니, 첫번재 작업에서는 100.0을 2로 나눈 값 50.0을 a에 다시 저장합니다. 그리고 a에 저장된 값 50.0츨력합니다.
그 다음에 반복할때는 50을 2로 나눈값인 25를 출력하고, 그 다음에 반복할때는 25를 2로 나눈 12.5를 출력합니다. 이렇게 출력하는 값이 점점 줄어들다가 나중에는 0을 계속 출력합니다. 숫자가 너무 작아 컴퓨터가 이를 인식할 수 없는 수준에 도달하는 것입니다. 컴퓨터의 한계를 확인하는 순간입니다. 아마 컴퓨터도 이런 한계가 있다는 것을 처음으로 보는 분들도 있을 것입니다.
이제 while 다음에 들여쓰기 한 부분(블록)에서 특정 조건이 맞으면 반복작업을 중단하는 코드를 프로그래밍해 보겠습니다.
a=100.0 while True : a = a/2 print(a) if a<0.00001 : break print("end of program")
if a<0.0001 : break print(“end of program”) 위의 코드에서는 a값이 0.00001 보다 작아지면 while로 하는 반복 작업에서 중단하고 while 아래 들여쓰기 한 블록에서 벗어나게 합니다. break가 while블록에서 벗어나게 하는 작업을 합니다. 위의 코드를 입력하고 Shift-Enter를 치면
50.0 25.0 12.5 6.25 3.125 1.5625 0.78125 0.390625 0.1953125 0.09765625 0.048828125 0.0244140625 0.01220703125 0.006103515625 0.0030517578125 0.00152587890625 0.000762939453125 0.0003814697265625 0.00019073486328125 9.5367431640625e-05 4.76837158203125e-05 2.384185791015625e-05 1.1920928955078125e-05 5.9604644775390625e-06 end of program
의 결과를 출력합니다. break를 쓰지 않고도 같은 결과를 출력하는 코드를 프로그래밍할 수도 있습니다.
a=100.0 while a>=0.00001 : a = a/2 print(a) print("end of program")
이전에 if다음에 썼던 조건과 반대 되는 조건을 while 다음에 써준 코드입니다. a에 저장된 값이 0.00001과 같거나 크면 while 아래 들여쓰기한 작업을 반복합니다. 그러다가 a값이 0.00001보다작아지면 a >= 0.00001의 결과는 False(거짓)가 되므로 while에서 벗어납니다.
원 둘레의 길이는 지름에 $\pi$를 곱한 값입니다. $\pi$를 계산하는 방법은 여러가지가 있는데 비교적 간단하게 계산하는 방법을 프로그래밍해보겠습니다. 이부분은 처음 프로그래밍하시는 분들에게 어려울 수 있으므로 건너 뛰셔도 됩니다. $\arctan$함수를 이용해 $\pi$를 계산하는 방법은 다음과 같습니다. (Taylor series에 대한 설명은 여기에서 프로그래밍과 별 상관 없으므로 생략하겠습니다)
$$\frac{\pi}{4} = \arctan(1)$$
$$\arctan(x) = x-\frac{x^3}{3}+\frac{x^5}{5}-\frac{x^7}{7}+\dotsb$$
$$\frac{\pi}{4} = 1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\dotsb$$
$$\pi = 4\times\left(1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\dotsb\right)$$
$$\pi = 4\times\left[\left(\frac{1}{1}-\frac{1}{3}\right)+\left(\frac{1}{5}-\frac{1}{7}\right)+\dotsb\right]$$
n = 1.0 sum = 0.0 while n<10000 : sum = sum+1.0/n-1.0/(n+2) n = n+4 print(sum*4.0) print("end of program");
$\pi$를 계산하는 방법은 여러가지가 있습니다. 그중에 프로그램하가가 가장 쉬운방법중에 하나가 위와 같이 $\arctan$를 이용하는 방법입니다. 하지만 좀더 정확한 $\pi$값을 구하려면 아주 많은 반복된 계산이 필요하기때문에 속도는 상당히 느린 편입니다. 위키피디어를 검색해서 $\pi$를 계산하는 빠른 방법을 찾을 수 있습니다. 이런 방법들을 프로그래밍하는 것도 프로그래밍 기초를 다지는데 도움이 됩니다.