상세 컨텐츠

본문 제목

[ Python 기초 문법 ] - 제어문(2) - while문

Language/Python

by bing_su 2023. 8. 11. 00:23

본문

반응형
SMALL

이번에 다룰 제어문은 조건문이 참인 동안에 명령어가 반복해서 수행되는 반복문인, while문에 대해 살펴볼 예정이다.

[ while문의 기본 구조 ]

while을 이용한 반복문의 기본 구조를 살펴보면 아래와 같다.

while (condition):  # 조건문이 참일 동안 반복
    Sentence 1
    Sentence 2
    …

while문의 순서도

위의 기본 코드와 순서도를 통해 살펴보자. 먼저, 어떤 값이 입력되면(Input) 해당 조건문을 테스트한다. 해당 값이 조건문에 대해 참이면 while문이 동작하여 while 블록의 문장이 수행되고, 거짓이 되면 while문 실행이 종료된다. 즉, 반복문은 조건식이 참일 동안 계속해서 동작한다.

 

해당 기본 구조를 참고하여, "열 번 찍어 안 넘어가는 나무 없다."라는 속담을 파이썬으로 구현해보자.

>>> treeHit = 0  # 나무를 찍은 횟수를 변수로 설정
>>> while treeHit < 10:  # 나무를 찍은 횟수가 10보다 작은 동안 반복
…    treeHit = treeHit + 1  # 나무 찍은 횟수 1씩 증가
…    print("I hit the tree {0} times.".format(treeHit))
…    if treeHit == 10:  # 나무 10번 찍었을 때 동작
…        print("The tree is falling over.")

# 출력 화면
I hit the tree 1 times.
I hit the tree 2 times.
I hit the tree 3 times.
I hit the tree 4 times.
I hit the tree 5 times.
I hit the tree 6 times.
I hit the tree 7 times.
I hit the tree 8 times.
I hit the tree 9 times.
I hit the tree 10 times.
The tree is falling over.

위의 예시 코드에서 while문의 조건문은 'treeHit < 10'이다. 즉, treeHit이 10보다 작을 동안 while 블록이 동작한다. 반복문 내부의 Logic을 간단히 정리하면 아래와 같다.

  • treeHit = treeHit + 1 : 나무를 찍은 횟수를 하나씩 늘려감.
  • print( ~ ) : 나무를 찍은 횟수를 출력함.
  • if문: treeHit이 10이 되었을 때 나무가 넘어갔다는 문장을 출력함.

while문이 반복되는 이러한 과정을 조금 더 자세히 정리하면 아래의 표와 같다.

treeHit 조건문 조건 판단 수행하는 문장 while문
0 0 < 10 True I hit the tree 1 times. 반복
1 1 < 10 True I hit the tree 2 times. 반복
2 2 < 10 True I hit the tree 3 times. 반복
3 3 < 10 True I hit the tree 4 times. 반복
4 4 < 10 True I hit the tree 5 times. 반복
5 5 < 10 True I hit the tree 6 times. 반복
6 6 < 10 True I hit the tree 7 times. 반복
7 7 < 10 True I hit the tree 8 times. 반복
8 8 < 10 True I hit the tree 9 time. 반복
9 9 < 10 True I hit the tree 10 times.
The tree is falling over.
반복
10 10 < 10 False   종료

표로 정리하면 꽤 긴 과정이다. 이러한 복잡한 과정을 반복문을 사용하면 간단하게 만들 수 있다.

[ While문 만들기 - 실습 ]

여러 가지 선택지 중 하나를 선택해서 입력받는 프로그램을 작성할 것이다. Quit을 선택하면 프로그램이 종료된다.

# 여러 가지 선택지를 문자열 변수로 만듦.
# 여러 줄에 걸친 문자열이므로 """(큰따옴표) 2개로 둘러쌌음.
>>> prompt = """
… 1. Add
… 2. Del
… 3. List
… 4. Quit
…
… Enter a number: """

# 4번 선택지가 입력될 때까지 반복하는 프로그램 작성.
>>> number = 0  # 선택지 번호를 입력 받을 변수 선언
>>> while number != 4:  #  입력 받은 변수가 4가 아니라면 계속 반복
…    print(prompt)  # 선택지 출력
…    number = int(input())  # 선택지 입력. 자세한 건 아래에서 설명

# 처음 출력 화면
1. Add
2. Del
3. List
4. Quit

Enter a number:

선택지 number가 4가 아닐 때까지 prompt를 계속 출력하는 반복문을 사용한 프로그램이다.

number = int(input())

나머지는 주석에 설명해뒀고, 해당 코드만 조금 더 자세히 살펴보자.

- input 함수

input 함수는 사용자로부터 입력을 받는 함수다. 해당 함수는 사용자가 입력하는 모든 값을 "문자열"로 취급한다.

input("문자열")에서 문자열은 사용자로부터 입력을 받을 때 보여줄 메시지다. input 함수에서 우리가 입력하는 값으로 인식되지 않는다는 것이다. 예를 들어 숫자를 입력해달라는 것을 사용자에게 보여주고 싶다면 input("Enter a number: ")의 형태로 작성하면 된다.

- int 함수

int 함수는 파이썬 내장 함수로, 다른 자료형을 정수형으로 변환해주는 함수다.

 

현재 실습에서는 사용자에게 선택지 번호를 input 함수를 통해 입력 받고 있다. 그리고 이 선택지 번호가 4인지 아닌지를 비교하며 반복문을 수행하고 있다. input 함수는 위에서 다뤘듯이, 입력 받은 값을 문자열로 인식한다. 그런데 우리는 반복문의 조건문에서 선택지를 숫자 4와 같은지 다른지를 비교하려 하므로, input 함수로부터 문자열로 인식된 선택지 번호를 다시 정수로 바꿔야 한다. (자료 형태가 같아야 비교가 가능함.) 따라서 int 함수를 통해 입력 받은 값을 정수로 변환해주고 있는 것이다.

 

input이나 int 함수에 대해서는 추후에 파이썬 내장 함수 부분에서 더 자세히 다룰 예정이다. 일단은 '해당 부분은 사용자의 숫자 입력을 받아들이는 부분' 정도로 이해하고 넘어가도 충분하다.

프로그램 실행 화면

해당 프로그램을 실행하면 위와 같다. 처음에는 1을 입력했기 때문에 계속해서 prompt가 출력되지만, 두번째에는 4를 입력했기 때문에 while문을 빠져나가고 프로그램이 종료된다.

[ while문 강제로 빠져나가기 ]

앞서 다룬 while문은 조건문이 참일 동안 내용을 반복적으로 수행한다. 하지만 프로그램을 설계하다 보면 특정 조건에서 강제로 while문을 빠져나가야 하는 상황도 분명 존재한다.

 

예를 들면, 커피 자판기에서 커피를 판매하는 중 커피가 떨어지면 '판매 중지'라는 문구가 나오며 커피를 뽑을 수 없다. 즉, 커피를 반복해서 팔다가 이러한 상황에서는 판매를 강제로 멈추게 해야 한다. 이럴 때 사용하는 것이 break문이다. 해당 예시를 break문을 사용하여 프로그램으로 구현해보자.

(현재 실습부터는 코드 길이가 길어지기 때문에 대화형 인터프리터가 아니라 에디터 사용할 것임. 주피터나 코랩으로 따라오던 사람들은 그냥 계속 원래 쓰던 거 쓰시면서 따라오면 됩니다!)

coffee = 10  # 자판기에 있는 커피를 변수로 선언
while True:  # 반복문의 조건문이 True이므로 무한 반복함.
    # 넣은 돈을 input 함수로 입력 받음. -> int 함수로 넣은 돈을 정수형으로 변환.
    money = int(input("Please put the money: "))
    if money == 300:  # 돈이 300원 있을 때
        print("I'll give you some coffee.")  # 커피 나옴.
        coffee = coffee - 1  # 남아 있는 커피 개수 하나 줄어듦.
    elif money > 300:  # 돈이 300원보다 많을 때
        # 커피 나오고 거스름돈 반환.
        print("I'll give you some coffee.\nAnd the change is {0} won.".format(money-300))
        coffee = coffee - 1  # 남아 있는 커피 개수 하나 줄어듦.
    else:  # 돈이 300보다 적을 때
        # 돈 더 넣으라고 출력. 남은 커피 수 같이 출력.
        print("You need more money.\nThere are {0} coffees left.".format(coffee))
    if coffee == 0:  # 커피가 하나도 남아 있지 않을 때
        # 판매 완료 문구 출력
        print("There is no more coffee. Sold out!")
        break  # 반복문 실행 종료 (커피 판매 종료)

[ while문의 맨 처음으로 돌아가기 ]

while문은 조건에 맞지 않으면 실행이 종료된다. 조건에 맞지 않을 경우에 while문을 빠져나가지 않고, 맨 처음 조건문으로 돌아가게 만드는 방법도 있다. 이럴 때 사용하는것이 continue문이다.

 

1부터 10까지 숫자 중에서 홀수만 출력하는 상황을 프로그램으로 구현해보자.

a = 0
while a < 10:  # a가 10보다 작을 때까지 반복
    a = a + 1  # a 값을 1씩 증가하며 반복
    if a % 2 == 0: continue  # a를 2로 나눴을 때 나머지가 0(짝수)면 맨 처음으로 돌아감
    print(a)  # 조건을 만족하는 a 값 출력
    
# 출력 화면
1
3
5
7
9

a가 10보다 작은 동안에는 a가 1씩 계속 증가한다. 반복문을 수행하던 중, a를 2로 나눈 나머지가 0이 될 경우(짝수가 될 경우)에는 continue문을 수행한다. 이 continue문은 이후 문장을 수행하지 않고 while문 맨 처음 조건문으로 돌아가게 하는 명령어다. 따라서 a가 짝수이면 print(a)는 수행되지 않을 것이다.

[ 무한 루프(loop) ]

무한 루프는 무한히 실행되는 반복문을 말한다. 우리가 사용하는 프로그램에서 굉장히 많이 사용한다. 파이썬에서 무한 루프는 while문으로 구현할 수 있다. 무한 루프의 기본 형태를 나타내면 아래와 같다.

while True:
    Sentence 1
    Sentence 2
    …

while문의 조건문이 True이므로 항상 참이 되어 반복문이 무한히 실행된다. 이러한 무한 루프는 'ctrl+C'를 누르거나 break문을 이용하여 빠져나갈 수 있다.

반응형
LIST

관련글 더보기

댓글 영역