파이썬 while 반복문 예시, 원리, 탈출 방법
안녕하세요. 이번 시간에는 파이썬의 대표 반복문 패턴 중 하나인
while 구문을 작성하는 기본 방법, 사용 케이스와 원리 그리고
탈출 방법 등에 대한 내용들을 정리해보도록 하겠습니다.
while문을 사용하는 경우, for문과의 차이
먼저, 다른 반복문 패턴인 for문 대신에 while문을 사용하는 것이 좋은 경우에 대해서
말씀드려보도록 하겠습니다.
for문과 while문의 차이는 반복 횟수를 정해 놓느냐와 종료 조건을 정해 놓느냐의 차이입니다.
예를 들어, 당첨 확률이 1%인 복권을 200장 사서 몇 번 당첨되었는지를 알고 싶을 때는
반복 횟수가 정해져있는 것이므로 for문을 사용하는 것이 좋고,
당첨이 될 때까지 복권을 몇 장 샀는지를 알고 싶을 때는
종료 조건이 정해져있는 것이므로 while문을 이용하는 것이 유리합니다.
두 구문의 코드 상 문법 차이는 아래 예시처럼 살펴볼 수 있습니다.
import random
# for문 예시
cnt = 0 # 당첨 횟수
for i in range(200): # 200회를 정해놓고 반복
if random.random() < 0.01: # 당첨 확률 1%
cnt += 1
print("200번 구입 결과, %d회 당첨되셨습니다!"%cnt)
# while문 예시
cnt = 0 # 당첨 횟수
buy = 0 # 복권 구입 횟수
while cnt == 0: # 당첨이 이루어지면 종료
buy += 1
if random.random() < 0.01: # 당첨 확률 1%
cnt += 1
print("%d회 만에 당첨되셨습니다!"%buy)
while문 기본 예제와 원리
for문을 사용하는 경우 처럼 반복 횟수를 정해 놓는 경우도 간접적으로 구현이 가능합니다.
예를 들어, 1~20까지의 합을 구하고 싶다면 아래처럼 while문으로 구현할 수도 있습니다.
i = 1
hap = 0
while i < 21: # 20보다 크면 종료
hap += i
i += 1
print(hap)
여기서 while문의 원리는 가장 처음에 조건 비교를 수행하게 되고,
이후에 loop 내의 코드가 모두 실행된 뒤, 다시 조건 비교를 수행하여
조건을 어긴 경우 반복을 종료하게 됩니다.
위의 예시에는 i = 1 ~ 20까지일 때는 진입부에서 i < 21 조건을 만족하여 loop 내 코드를
실행하지만, i = 21이 된 상태로 조건 비교를 하게 되면
21 < 21이 False이므로 i = 21인 경우는 hap에 덧셈을 하지 않고
while loop를 빠져나오게 됩니다.
while문을 이용한 중첩 반복문(구구단 예시)
while문 내에 for문이나 다른 while문이 내부에 포함되는 것도 가능합니다.
다음 예시는 이중 for문을 while문을 이용하여 대체하여 구구단을 작성한 예시입니다.
# 구구단 예시(2 ~ 4단)
i = 2
while i < 5:
for j in range(2, 10):
print("%d * %d = %d"%(i, j, i * j))
print("-" * 30)
i += 1
while문 강제 탈출 하기 : break
보통 진입부의 조건을 만족하지 않는 경우 while문을 빠져나오게 되지만,
중간의 break 지시문을 만나게 되면 언제든지 while문을 탈출할 수 있게 만들 수 있습니다.
맨 위의 복권 당첨 예제 코드를 다음과 같이 바꿔서 작성해보도록 하겠습니다.
buy = 0 # 복권 구입 횟수
while True: # 항상 참
buy += 1
if random.random() < 0.01: # 당첨 확률 1%
break # 반복문 종료
print("%d회 만에 당첨되셨습니다!"%buy)
여기서는 조건 제시부에서 while True:로 항상 조건을 만족하고 있습니다.
따라서, loop 내 코드도 지속적으로 실행될 것이고,
만일 강제 탈출 지시가 없다면 무한 루프에 빠지게 됩니다.
그러나 당첨 조건 만족시 작성해둔 break를 만나게 되면서 while문은 실행이 즉시 종료되고,
정상적으로 구입 횟수를 출력하게 만들 수 있게 됩니다.
참고로, break를 만나면 루프 내 아랫부분의 코드 실행도 모두 생략하고
while문 밖의 다음 코드로 넘어간다는 점을 기억해주세요.
아래의 예시 코드에서는 5가 출력되지 않고 4까지만 출력되고 while문이 종료됩니다.
i = 0
while i < 10:
i += 1
if i == 5:
break # 루프를 빠져나오면서 5는 출력 X
print(i)
# 출력 결과
1
2
3
4
while문 도입부로 되돌아가기 : continue
이번에는 루프 아래의 코드 실행을 중지하는 상황에서
완전히 while문을 종료하는 것이 아니라 도입부로 되돌아가서 다시 조건을 체크하게 만드는
continue 지시문의 예시에 대해서 살펴보도록 하겠습니다.
이해를 돕기 위하여 바로 위의 예제 코드에서
break 부분을 continue로 바꾸어 실행한 결과를 살펴보도록 하겠습니다.
i = 0
while i < 10:
i += 1
if i == 5:
continue # 도입부로 되돌아가면서 5는 출력 X
print(i)
# 출력 결과
1
2
3
4
6
7
8
9
10
1~10의 숫자들 중 5만 제외하고 정상 출력이 되었습니다.
즉, i = 5가 아닌 경우는 루프 가장 아래의 print 문에서 숫자가 정상 출력이 되었지만
i = 5일 때는 continue를 만나 아래의 print는 실행되지 못하고
다시 조건 검사부로 되돌아간 모습을 살펴볼 수 있었습니다.
while문 응용 예제 : 프로그램 콘솔창
마지막으로, while 루프를 이용하여 프로그램을 작성하는 응용 예시를 살펴보겠습니다.
콘솔창을 띄워서 input을 받는 프로그램의 경우 while문을 이용하면 구현이 편리합니다.
예를 들어, 음식 주문을 받는 상황을 가정한 프로그램을 작성한 예시입니다.
실행이 종료되면, 총 가격을 출력하는 경우까지 구현해보았습니다.
money = 0
while True:
num = input('''무엇을 주문하시겠습니까?
1. 자장면 : 6000원
2. 짬뽕 : 7000원
3. 볶음밥 : 8000원
4. 탕수육 : 20000원
5. 실행 종료''')
if num == '1':
print('자장면 1개를 추가합니다.')
money += 6000
elif num == '2':
print('짬뽕 1개를 추가합니다.')
money += 7000
elif num == '3':
print('볶음밥 1개를 추가합니다.')
money += 8000
elif num == '4':
print('탕수육 1개를 추가합니다.')
money += 20000
elif num == '5':
print('총 가격은 %d원 입니다. 감사합니다.'%money)
break
else: print('잘못된 입력입니다. 다시 입력해주세요.')
'Python > 파이썬 기초' 카테고리의 다른 글
파이썬 리스트 인덱싱, 슬라이싱 경우의 수 총정리 (0) | 2022.02.12 |
---|---|
파이썬 enumerate 이용 인덱스 번호 동시 for문 순회 (0) | 2022.01.19 |
파이썬 주석 처리 방법 : 한줄, 여러줄, 단축키(파이참, 주피터, 코랩) (0) | 2022.01.06 |