▼2020년/파이썬 기초

[Python] 파이썬에서의 제어문 (while문) (2/3)

ITISIK 2020. 1. 22. 11:04
반응형

지난 포스트에서는 파이썬에서의 조건문에 해당하는 if문, if-else문, if-elif-else문에 대해서 알아보았다. 이번 포스트에서는 반복문 두 가지 중 하나인 while문을 공부하려고 한다.

 

반복문 중 하나, while문

  if문은 조건의 참, 거짓 여부에 따라 수행할지 하지 않을지 결정하는 제어문이었다면, 이번 포스트에서 배우는 while문과 다음 포스트에서 배울 for문은 특정 코드 혹은 특정 범위를 반복수행할 때 사용하는 제어문이다. 각 포스트의 본문에서 더 자세히 언급하겠지만 while문은 '횟수를 정하기에는 애매하거나 변동사항에 있기 때문'에, 특정 조건을 만족하는 동안 반복시키고자 할 때 사용되며 for문은 '횟수를 명확히 지정해줄 수 있을 때' 사용하는 반복문이다.

 

while문은 아래와 같이 아주 간단한 구조를 하고 있다.

while 조건문:
    조건문이 True인 동안 반복해서 수행할 문장.

# 만약 조건문이 절대적 참값(True, 1 등)인 경우에는 위 문장이 무한히 반복해서 출력되다가
# 메모리 공간을 모두 사용하면 그제서야 프로그램이 멈추게 되는데,
# 이를 무한루프 혹은 무한루프에 빠졌다라고 표현한다. ※ 루프(Loop) : 반복

 

while문에서의 무한루프

while True:
    print('inf Loop')

# 무한루프에 빠트려 보았다.
# 무한루프에서 빠져나오려면 Ctrl + c를 누르면 된다.

 

while문을 이용한 반복문

  이번에는 반복되다가 조건에 맞지 않게 되어 자동으로 반복을 멈추는 while문을 작성해보자. 내가 가진 돈에서 10,000원씩 빼서 나누어 주다가, 내 전재산이 100,000원 미만이 되면 그만 나누어 주는 프로그램을 만들어보겠다.

total_money = 142857
drop_money = 10000

while total_money > 100000:
    total_money = total_money - drop_money
    print(total_money)

 

  위 코드결과를 보고 조건문은 total_money > 100,000인데, 왜 전재산이 92,857원이 되었는지 의아한 분이 계실 것이다. 코드는 위에서 아래로 차근차근 차례대로 수행된다는 점에 집중해서 보면 금방 그 이유를 알 수 있다.

  위 코드가 동작하는 모든 로직을 적으면 아래와 같다.(숫자에서 콤마는 가독성을 위해서 인위적으로 넣었다.)

 

1. total_money(142,857)가 100,000보다 큰가? → 크다.

2. total_money = total_money - drop_money 문 실행.(total_money = 142,857 - 10,000)

3. print(total_money) → 132,857 출력

 

4. total_money(132,857)가 100,000보다 큰가? → 크다.

5. total_money = total_money - drop_money 문 실행.(total_money = 132,857 - 10,000)

6. print(total_money) → 122,857 출력

 

7. total_money(122,857)가 100,000보다 큰가? → 크다.

8. total_money = total_money - drop_money 문 실행.(total_money = 122,857 - 10,000)

9. print(total_money) → 112,857 출력

 

10. total_money(112,857)가 100,000보다 큰가? → 크다.

11. total_money = total_money - drop_money 문 실행.(total_money = 112,857 - 10,000)

12. print(total_money) → 102,857 출력

 

13. total_money(102,857)가 100,000보다 큰가? → 크다.

14. total_money = total_money - drop_money 문 실행.(total_money = 102,857 - 10,000)

15. print(total_money) → 92,857 출력

 

16. total_money(92,857)가 100,000보다 큰가? → 크지 않다.

17. 수행문을 동작시키지 않고 프로그램(반복문)을 종료한다.

 

  이렇게 반복문의 모든 동작을 적어보면 왜 그 반복문이 그렇게 동작했는지 알 수 있다. 처음 반복문을 배울 때에는 헷갈릴 수 있으므로 단순 반복 작업이더라도 이렇게 직접 체크하면서 프로그램의 흐름을 익히는 과정이 중요하다고 생각한다.

 

대입연산자의 활용

  예전의 연산자 포스트에서 배웠던 -=과 같은 대입연산을 위 코드에 적용함으로써 아래와 같이 코드를 조금 더 간단하게 고칠 수 있다.

total_money = 142857
drop_money = 10000

while total_money > 100000:
    total_money -= drop_money
    print(total_money)

 

while문 내부의 if문

  이번엔 while문 안에 수행될 문장으로 if문을 넣어서 조금 더 유용한 프로그램을 만들어보자. 아래의 프로그램은 1부터 지정한 수(number)까지의 수중에서 3의 배수에 해당하는 경우 해당 값을 출력해주는 프로그램이다. 이름하여 '3의 배수 알리미' 되시겠다.

number = 10
while number > 0:
    if(number % 3 == 0):
        print(str(number) + '는 3의 배수입니다.')
    number -= 1

  이렇게 3의 배수를 출력해준다. 이렇게 단순 출력말고, 아래와 같이 3의 배수들(number를 3으로 나누었을 때 그 나머지가 0이면, number는 3의 배수임을 이용.)만 모여있는 집합이나 리스트 등을 만들어 그 안에 넣어줄 수도 있다.

number = 10
mulp3 = []
while number > 0:
    if(number % 3 == 0):
        mulp3.append(number)
    number -= 1

print(mulp3)

조금 더 복잡하게 만들자면 3의 배수와 5의 배수를 동시에 판단하도록 아래와 같이 코드를 작성할 수도 있다.

※ 아래에서 if-elif문을 사용할 경우, 3의 배수이면서 동시에 5의 배수인 경우(15 같은 수)에는 해당 수가 5의 배수 리스트(mulp5)에 포함되지 않는 문제가 발생됩니다.

number = 10
mulp3 = []
mulp5 = []
while number > 0:
    if(number % 3 == 0):
        mulp3.append(number)
    if(number % 5 == 0):
        mulp5.append(number)
    number -= 1

print(mulp3)
print(mulp5)

 

while문의 반복 굴레에서 강제로 빠져나가기(break문)

  이번 포스트에서는 break문이 어떻게 작동되는지 그리고 어떨 때 사용하는지에 대해서 간단하게만 살펴보려고 한다. break문은 이름 그대로 반복문에 브레이크를 걸어주는 것이다. 일반적으로는 아래의 코드처럼 특별한 상황에 처했을 때 break문을 실행시켜서 반복문을 멈출 것이다. 아래 프로그램은 '지정한 숫자(number)보다 작거나 같은 수 중에서 가장 큰 28의 배수를 찾는 프로그램'이다.

number = 142857
while True:
    if(number % 28 == 0):
        print(number)
        break;
    number -= 1

  142857보다 작거나 같은 수 중에서 가장 큰 28의 배수는 142856이라고 한다. 실제로 while문의 조건식이 절대참(True)인데도 불구하고 해당 값만 출력해주고 while문은 더 이상 동작하지 않았다.

 

 

  이렇게 목적을 달성하고 나면 해당 반복문의 동작을 멈추기 위해서 사용하는 것이 일반적이다. 실제 생활 속에서 이런 예를 들자면, 과일 장수가 과일을 파는데, 더 이상 남은 과일 재고가 없을 때에는 장사를 지속하는 것(while문에 따라 반복하는 것)에 의미가 없게 된다. 따라서 과일의 재고 유무를 판단하여 재고가 없는 경우 장사를 접고 돌아가게끔 프로그램을 작성해줄 때에도 break문이 활용될 수 있겠다.

 

하기 문장을 수행하지 않고 while문의 조건문으로 돌아가기(continue문)

  break문이 해당 while문을 완전히 종료하는 키워드였다면, continie문은 해당 반복구절(반복 되는 코드들)중에서 continue를 만난 경우 그 아래의 수행문은 수행하지 않고 곧바로 while문의 조건문으로 올라가도록 하는 키워드이다. 말로 설명하고 이해하기는 어려운데, 코드 예시와 그 동작 순서를 일일히 확인해보면 어렵지 않게 이해할 수 있다.

 

  위에서 우리가 했던 3의 배수를 출력하는 프로그램을 continue문을 이용해서 수정하여 작성해보도록 하겠다.

number = 0
while(number < 10):
    number += 1
    if number % 3 != 0:
        continue
        # continue를 타면, 아래에 적힌 while 반복 수행문은 모두 수행되지 않고 바로 조건식으로 올라간다.
    print(number)

위 코드가 동작하는 모든 로직을 적으면 아래와 같다.

 

1. number(0)가 10보다 작은가? → 작다.

2. number += 1(number = 0 + 1)

3. number(1)를 3으로 나눈 나머지가 0이 아닌가? → 아니다.(if문의 조건문이 True)

└ continue 키워드에 해당됨으로, 아래에 적힌 print(number)는 작동되지 않고 while문의 조건문으로 올라간다.

 

4. number(1)가 10보다 작은가? → 작다.

5. number += 1(number = 1 + 1)

6. number(2)를 3으로 나눈 나머지가 0이 아닌가? → 아니다.(if문의 조건문이 True)

 

7. number(2)가 10보다 작은가? → 작다.

8. number += 1(number = 2 + 1)

9. number(3)를 3으로 나눈 나머지가 0이 아닌가? → 맞다.(if문의 조건문이 False)

10. continue에 해당되지 않으므로 아래에 적힌 print(number) 코드를 탄다. → 3이 찍힌다.

11. number(3)가 10보다 작은가? → 작다.

12. number += 1(number = 3 + 1)

13. number(4)를 3으로 나눈 나머지가 0이 아닌가? → 아니다.(if문의 조건문이 True)

 

14. number(4)가 10보다 작은가? → 작다.

15. number += 1(number = 4 + 1)

16. number(5)를 3으로 나눈 나머지가 0이 아닌가? → 아니다.(if문의 조건문이 True)

 

17. number(5)가 10보다 작은가? → 작다.

18. number += 1(number = 5 + 1)

19. number(6)를 3으로 나눈 나머지가 0이 아닌가? → 맞다.(if문의 조건문이 False)

20. continue에 해당되지 않으므로 아래에 적힌 print(number) 코드를 탄다. → 6이 찍힌다.

 

21. number(6)가 10보다 작은가? → 작다.

22. number += 1(number = 6 + 1)

23. number(7)를 3으로 나눈 나머지가 0이 아닌가? → 아니다.(if문의 조건문이 True)

 

24. number(7)가 10보다 작은가? → 작다.

25. number += 1(number = 7 + 1)

26. number(8)를 3으로 나눈 나머지가 0이 아닌가? → 아니다.(if문의 조건문이 True)

 

27. number(8)가 10보다 작은가? → 작다.

28. number += 1(number = 8 + 1)

29.number(9)를 3으로 나눈 나머지가 0이 아닌가? → 맞다.(if문의 조건문이 False)

30. continue에 해당되지 않으므로 아래에 적힌 print(number) 코드를 탄다. → 9가 찍힌다.

 

31. number(9)가 10보다 작은가? → 작다.

32. number += 1(number = 9 + 1)

33. number(10)를 3으로 나눈 나머지가 0이 아닌가? → 아니다.(if문의 조건문이 True)

 

34. number(10)가 10보다 작은가? → 작지 않다.

└ while문 탈출.

 

  위와같은 코드 흐름에 따라서 3, 6, 9가 찍히게 된 것이다. 말로 표현하는 것이 서툴어서 여기까지 읽으신 분들께 죄송하지만, while문은 또다른 반복문인 for문 보다는 덜 쓰이는 편이므로 너무 좌절하지 마시고 그 흐름만 이해할 수 있는 수준으로 넘어가면 좋을 것 같다. 다음 포스트에서는 주로 사용되는 반복문인 for문에 대해서 알아보려고 한다.

반응형