본문 바로가기
방구석코딩/파이썬 기초문법

[파이썬 데이터 분석] 또 다른 반복문 ② - For문 응용, break, continue, pass

by 석세상 2022. 6. 7.
반응형

for문의 작동원리에 대해서 익혀보았다면 이번에는 몇가지 추가 기능에 대해서 알아보자. break, countinue, pass에 대해서 알아볼텐데 이 기능들은 for문 뿐만 아니라 while문에서도 동일하게 사용할 수 있다.

 

 

1. break, continue, pass 비교

다음 기능들에 대해서는 반복문에서 유용하게 사용하는 기능인데 특히, pass와 countinue는 헷갈릴 수 있으니 주의하자.

명령어 설명
break 반복문을 강제로 나갈 때 사용한다.
continue continue 이후의 문장을 실행하지 않고 반복문의 다시 맨처음으로 돌아가서 실행한다.
pass 반복문의 맨처음으로 돌아가는 continue와 달리 맨처음으로 돌아가지 않고 하는 다음 문장을 실행한다.

 

2. break

매일 10명의 손님이 1잔의 음료를 시켜서 10잔을 만들 재료를 가게에 들여오는데 오늘은 7번째 손님이 3잔의 음료를 시켜 그 다음 손님들에게는 재료가 소진되어 음료를 줄 수 없어 판매가 종료되었다는 안내와 함께 7번째 손님에서 반복문이 멈춰야 한다고 하자.

 

1~10명까지의 평소 손님의 수대로 10번을 반복하려면 range의 범위를 주어야 하는데 마지막 범위 이전까지 반복하므로 range(1,11)로 10명의 손님을 입력한다.  다음으로 "몇번째 손님 음료 나왔습니다"라는 멘트와 함께 반복문이 실행되는데 7번째 손님이 3잔을 시켰으므로 cust가 7이 되는 순간 "7번째 손님 음료가 나왔습니다"라는 멘트와 함께 "재료가 소진되었습니다"라는 말도 함께 출력되고, 그 이후에는 실행되지 않아야 한다.

break문 미사용 break문 사용
[입력문]
for cust in range(1,11) :
    print("{0}번째 손님 음료 나왔습니다.".format(cust))
    if cust == 7 :
        print("재료가 소진 되었습니다.")


[출력결과]
1번째 손님 음료 나왔습니다.
2번째 손님 음료 나왔습니다.
3번째 손님 음료 나왔습니다.
4번째 손님 음료 나왔습니다.
5번째 손님 음료 나왔습니다.
6번째 손님 음료 나왔습니다.
7번째 손님 음료 나왔습니다.
재료가 소진 되었습니다.
8번째 손님 음료 나왔습니다.
9번째 손님 음료 나왔습니다.
10번째 손님 음료 나왔습니다.
[입력문]
for cust in range(1,11) :
    print("{0}번째 손님 음료 나왔습니다.".format(cust))
    if cust == 7 :
        print("재료가 소진 되었습니다.")
        break

[출력결과]
1번째 손님 음료 나왔습니다.
2번째 손님 음료 나왔습니다.
3번째 손님 음료 나왔습니다.
4번째 손님 음료 나왔습니다.
5번째 손님 음료 나왔습니다.
6번째 손님 음료 나왔습니다.
7번째 손님 음료 나왔습니다.
재료가 소진 되었습니다.



위의 결과를 비교해보자면 break를 사용하지 않은 경우는 재료가 소진되어 7번째 손님의 주문 후 "재료가 소진되었습니다"라는 멘트와 함께 중지되어야 하는데 계속 반복문이 실행되어 8~10번째 손님에게 잘못된 결과가 출력되고 있는 것을 볼 수 있다. 오른쪽의 break를 사용한 결과는 "재료가 소진 되었습니다."라는 멘트 후 break를 만나 반복문에서 강제로 탈출해 올바른 결과가 나오는 것을 볼 수 있다.

 

break문이 유용하게 사용되는 경우

만약 위의 예제에서 손님의 수가 정해져 있지 않고 계속 증가한다고 하면 반복문은 계속 실행될 것이다. 이렇게 반복문이 계속 실행되는 것을 무한루프라고 하는데 이때 무한루프를 끝내고 싶을 때 break문이 유용하게 사용된다. 나중에 무한루프를 다룰 때가 있는 경우 자세히 알아보자.

 

 

3. continue

만약 음료 주문을 했는데 그 손님이 오지 않은 경우 그 손님을 부르지 않고 다음 손님을 부른다고 가정하면 어떻게 프로그램을 짜야할까?

 

5번째 손님과 7번째 손님이 시간이 지나도 오지 않았다고 하자. 그럼 timeout이라는 변수에 오지 않은 손님인 5, 7을 리스트 형태로 입력한다. 그렇게 반복문을 실행하게 되면 cust와 timeout과 같은 숫자가 들어있는 5를 만난 순간 다음 문장인 else를 실행하지 않아 "5번째 손님 음료 나왔습니다."라는 문구가 출력되지 않고, 다시 반복문의 맨 처음으로 돌아가서 반복문을 실행하게 된다. 

[입력문]
timeout = [5, 7]                   # 주문 시간이 지난 손님
for cust in range(1,11) :
    if cust in timeout :
        continue
    else :
        print("{0}번째 손님 음료 나왔습니다.".format(cust))

[출력결과]
1번째 손님 음료 나왔습니다.
2번째 손님 음료 나왔습니다.
3번째 손님 음료 나왔습니다.
4번째 손님 음료 나왔습니다.
6번째 손님 음료 나왔습니다.
8번째 손님 음료 나왔습니다.
9번째 손님 음료 나왔습니다.
10번째 손님 음료 나왔습니다.

 

 

4. pass

pass 명령어는 해당 조건인 경우 아무것도 실행하지 않고 다음 문장을 실행하라는 것이다. 앞의 continue의 예제의 경우에는 continue를 pass라고 바꿔도 동일한 결과가 산출된다. 하지만 작동원리에 있어서는 큰 차이가 있기 때문에 나중에 둘을 구별해서 사용할 경우가 생긴다. 아래 내용을 보면 두 명령어의 작동원리에 대한 차이를 확실히 알 수 있다.

 

1) continue 작동 순서

cust가 5나 7이 아닌 경우는 정상적으로 맨 마지막 문장까지 실행하지만, 5 또는 7인 경우에는  continue를 만나게 된다. 그러면 continue는 '반복문의 맨 처음으로 돌아가라'라는 의미로 for가 있는 곳으로 돌아간다. cust가 5인 경우를 예를 들어보자면 따라서 else 부분으로 내려가지 않기 때문에 출력문이 나오지 않고 for 부분으로 올라가기 때문에 그 다음 번호인 6번이 실행되는 경우이다.

continue 명령어 실행

 

2) pass 작동 순서

위의 continue와 마찬가지로 cust가 5인 경우만 예를 들어보자. cust가 5인 경우 pass를 만나게 되는데 여기서 pass는 continue와 같이 for 부분으로 올라가지 않고 else 부분으로 내려가게 된다. 하지만 else에서는 5가 아니면 print문을 실행하라는 뜻이기 때문에 출력문이 나오지 않게 되는 것이다.

 

여기서 continue와 pass의 차이점이 명확하게 나타나게 되는데 pass의 경우는 else 부분까지 실행한 후에 다시 for문으로 돌아가는 것이고, continue의 경우는 아예 else 부분 자체를 실행하지 않고 다시 for문으로 돌아가는 것이다.

pass 명령어 실행

 

출력결과만 본다면 위의 예제 안에서는 둘 모두 동일한 결과가 생성되지만 실제 작동하는 원리는 큰 차이가 있으므로 다른 케이스에서는 다른 결과가 나올 수 있다는 것을 알아두도록 하자.

 

 

5. 간단한 형태의 for문 쓰기 (리스트 안에 포함하기)

while문은 불가능하지만 for문에서는 리스트 안에 for문을 넣어서 간단하게 사용하는 특별한 방법도 가능하다. 만약 음료를 만드는데 3가지 재료를 사용하는데 각각의 비용이 인플레이션으로 인해 2배 증가했다고 하자. 그럼 다음과 같이 쉽게 적용할 수 있다. 리스트 안에 for문을 넣게 되는데 for 이후 문법은 일반적인 형태와 동일하고 왼편에 해당하는 변수의 연산 등을 입력하면 간단하게 적용되는 것을 볼 수 있다.

[입력값]
cost = [100, 200, 300]
[increase * 2 for increase in cost]

[출력결과]
[200, 400, 600]

 

728x90
반응형

댓글