본문 바로가기
파이썬/기초 문법

[파이썬]while, for 반복문 탈출과 계속하기 - break, continue

by 코키드 Cokid 2022. 10. 7.
반응형

이번 포스팅에서는 while과 for 같은 반복문에서 조건문이 True인 경우에도 반복문을 탈출할 수 있게 해주는 break와 반복문의 시작 지점으로 돌아가게 해주는 continue에 대해 알아본다.

 

반복문 강제로 탈출하기 - break

break로 반복문 강제로 탈출하기

while문의 조건문이 True일 경우에도 break로 while문을 빠져나올 수 있다.

count = 0
while True:
    count += 1
    print('현재 카운트 %d' %count)
    if count == 5:
        break
print('while문 탈출')
#결과 출력
현재 카운트 1
현재 카운트 2
현재 카운트 3
현재 카운트 4
현재 카운트 5
while문 탈출

위 예문을 보면 조건문은 항상 True이기 때문에 while문은 무한 반복되어야 한다. 하지만 count가 5가 되면 if문이 실행되어 break가 실행된다. 결과를 보자.

 

break 응용하기

500원짜리 동전만 넣을 수 있는 자판기가 있다. 500원짜리 동전을 넣으면 음료수를 내주고 500원 외의 동전을 넣으면 고장이 나서 점검이 필요해 사용할 수 없다. 이를 while문과 break로 구현해보자.

while True:
    coin = int(input("동전을 넣어주세요.  "))
    if coin == 500:
        print("음료수가 나왔습니다.")
    else:
        print("500원짜리 동전이 아닙니다.")
        break
print("점검이 필요합니다.")
#결과 출력
동전을 넣어주세요.  500
음료수가 나왔습니다.
동전을 넣어주세요.  100
500원짜리 동전이 아닙니다.
점검이 필요합니다.

100원짜리 동전을 넣자 while문이 종료되고 그다음 점검이 필요하다는 메시지를 출력한다.

 

for문에서의 break

for문에서 break를 활용해보자. 구구단을 외우는 코드를 짜보자. 프로그램은 몇 단 까지 외울지 물어보고 입력값을 받는다. 그리고 입력한 단수까지 외우고 프로그램을 종료시킨다. 

level = int(input('몇 단까지 구구단을 외우시겠어요?'))
for i in range(2, 10):
    if i > level: # 입력한 단수가 넘으면 for문 탈출
        break
    print('{}단: '.format(i), end = '')
    for j in range(1, 10):
         print(i*j, end =  ' ')
    print('')
print("{}단까지 외웠습니다.".format(level))
몇 단까지 구구단을 외우시겠어요?  5
2단: 2 4 6 8 10 12 14 16 18
3단: 3 6 9 12 15 18 21 24 27
4단: 4 8 12 16 20 24 28 32 36
5단: 5 10 15 20 25 30 35 40 45
5단까지 외웠습니다.
i가 level에 입력 된 5보다 커질 때 break가 실행되고 for문은 9단까지 반복하지 않고 종료된다. for문이 종료되고 for문 밖에 있는 "5단까지 외웠습니다" 문구가 출력되는 걸 볼 수 있다.
 

break는 바로 앞의 반복문만 종료한다

이번에는 while문과 for문을 사용하여 구구단 프로그램을 만들어보자. 구구단은 2~9단까지며, 그 외의 숫자를 입력받으면 범위를 벗어났다는 문구와 함께 프로그램을 종료한다.

while True:
    level = int(input('몇 단까지 구구단을 외우시겠어요?   '))
    if level >=2 and level < 10:
        for i in range(2, 10):
            if i > level:
                break # 바로 앞의 for문 탈출
            print('{}단: '.format(i), end = '')
            for j in range(1, 10):
                print(i*j, end =  ' ')
            print('')

        print("{}단까지 외웠습니다.".format(level))
    else:
        break # 바로 앞의 while문 탈출
print("범위를 벗어났습니다.")
#결과 출력
몇 단까지 구구단을 외우시겠어요? 4
2단: 2 4 6 8 10 12 14 16 18
3단: 3 6 9 12 15 18 21 24 27
4단: 4 8 12 16 20 24 28 32 36
45까지 외웠습니다.
몇 단까지 구구단을 외우시겠어요? 10
범위를 벗어났습니다.

위 코드를 보면서 break가 종료시키는 반복문의 범위를 확인해보자. i 가 level 4보다 커질 때 if문 안의 for문의 break가 실행되어, for문을 탈출하고 다시 while문을 반복한다. 그리고 2~9 범위 밖의 값을 입력받으면 else문의 break가 실행되어 while문까지 종료된다.

예문에서 볼 수 있듯이 break는 자신을 감싸고 있는 바로 앞의 반복문만 종료시킬 수 있다.

 

반복문의 처음으로 돌아가기 - continue

continue로 반복문 처음으로 돌아가기

break로 반복문을 탈출하는 반면 continue로 반복문의 처음으로 돌아갈 수 있다.

check_list = ['속옷', '양말', '세면도구', '화장품', '충전기']

당신이 여행을 가는데 필요한 물건을 챙겼는지 알려주는 프로그램을 만들어보자. 리스트 check_list에는 여행에 필요한 물건들을 입력해준다.

 

prepared_list = []
for i in check_list:
    print('{}을(를) 챙기셨습니까? [Y/N]'.format(i))
    prepared_item = input()
    if prepared_item == 'N':
        continue
    prepared_list.append(i)

for문으로 check_list에 있는 물건들을 챙겼는지 하나씩 확인해주는 문장을 작성한다. 'Y'를 입력하면 물건을 챙긴 것으로 'N'을 입력하면 챙기지 않은 것이다.(사실 'Y'를 입력하지 않아도 챙긴 것으로 간주된다)

챙긴 물건은 prepared_list에 하나씩 입력된다. 만약 'N'을 입력하면 if문이 실행되어 continue가 실행된다.

결과를 확인해보자.

 

must_prepare = []
for i in check_list:
    if i not in prepared_list:
        must_prepare.append(i)
print('당신이 챙겨야할 물건은 '+ ', '.join(must_prepare) + '입니다.')

챙겨야 할 물건이 prepared_list에 없으면 must_prepare 리스트에 입력이 되고 for문이 끝나면 당신이 챙기지 않은 물건을 출력한다.

#결과 출력
속옷을(를) 챙기셨습니까? [Y/N] N
양말을(를) 챙기셨습니까? [Y/N] N
세면도구을(를) 챙기셨습니까? [Y/N] Y
화장품을(를) 챙기셨습니까? [Y/N] Y
충전기을(를) 챙기셨습니까? [Y/N] N
당신이 챙겨야할 물건은 속옷, 양말, 충전기입니다.

 

continue에 의해 'N'이 입력된 항목엔 prepared.append() 함수가 실행되지 않았다.

continue도 break와 마찬가지로 continue가 들어있는 반복문의 처음으로만 갈 수 있다.

scores = {'1반': [66, 70, 80 ,55], '2반': [53, 57, 80, 90, 99], '3반': [27, 85, 79, 48]}

각 반에서 시험 점수가 60점이 넘은 학생들만 골라서 평균을 내고 80점이 넘은 학급에 상품을 주는 프로그램을 만들어보자.

우선 각 학급과 점수 정보를 딕셔너리 형태로 입력한다.

 

total_score = []
final = []
for i in scores:
    for j in scores[i]:
        if j < 60: # 학생들의 점수가 60점이 넘지 않으면 아래 for문의 처음으로 간다
            continue
        total_score.append(j)
    avg = int(sum(total_score)/len(total_score))
    print('{}, 60점 넘은 학생 수: {}, 평균: {}'.format(i, len(total_score), avg)
    if avg < 80: # 60점을 넘은 학생들의 평균이 80 이하면 for문의 처음으로 간다
        continue
    final.append(i)
    total_score = []
print('상품을 받을 반은 {}입니다.'.format(', '.join(final)))

학급마다 60점이 넘은 점수를 입력할 total_score와, 평균점수가 80을 넘긴 반을 입력할 final를 빈 리스트로 만들어준다.

두 번째 for문에서 scores[key]로 각 학생의 점수를 얻어 60점이 넘으면 total_score에 추가하고, 60을 넘지 않으면 if문에서 continue가 실행되어 for문의 처음으로 돌아가 다시 학생들의 점수를 읽는다.

60점이 넘은 학생들의 평균점수를 avg에 넣고 첫 번째 for문에서 avg가 80점이 넘으면 final에 추가하고 아니면 if문이 실행되어 continue가 실행되어 for문의 처음으로 돌아간다.

결과를 출력해보자.

#결과 출력
1반, 60점 넘은 학생 수: 3, 평균: 72
2반, 60점 넘은 학생 수: 6, 평균: 80
3반, 60점 넘은 학생 수: 2, 평균: 82
상품을 받을 반은 2반, 3반입니다.

결과 출력에서 각 학급마다 60점을 넘긴 학생 수를 보면 60점 아래의 학생들은 continue에 의해 집계되지 않은 것을 알 수 있다. 또 평균 점수가 80이 되지 않는 1반도 continue에 의해 집계되지 않았다.

반응형

댓글