지난 포스트에서는 파이썬에서의 조건문에 해당하는 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문에 대해서 알아보려고 한다.
'▼2020년 > 파이썬 기초' 카테고리의 다른 글
[Python] 파이썬에서의 함수 (0) | 2020.01.23 |
---|---|
[Python] 파이썬에서의 제어문 (for문) (3/3) (0) | 2020.01.22 |
[Python] 파이썬에서의 제어문 (if문) (1/3) (0) | 2020.01.22 |
[Python] 파이썬에서의 연산, 연산자 (0) | 2020.01.22 |
[Python] 파이썬에서의 자료형, 논리형(Bool) (7/7) (0) | 2020.01.22 |