Python Camp

Logo

Life is short. You need Python.

03장 프로그램의 구조를 쌓는다! 제어문

3-2 ) while문


「나무는 열 번 찍어야 넘어간대.」

열 번 …? 그럼 열 번 넘어 찍으면 이미 넘어갔는데 나무가 아프겠네?

(1) while문의 기본 구조

나무를 찍는 건 조건일까, 반복일까?

반복해서 문장을 수행해야 할 경우 while문을 사용한다.
그래서 while문을 반복문이라고도 부른다.

while <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    <수행할 문장3>
    ...

조건문이 참인 동안에 while문 아래에 속하는 문장들이 반복해서 수행된다.

“열 번 찍어 안 넘어 가는 나무 없다”

treeHit = 0

while treeHit < 10:
    treeHit = treeHit +1
    print("나무를 %d번 찍었습니다." % treeHit)
    
    if treeHit == 10:
        print("나무 넘어갑니다.")

(2) while문 만들기

# 여러줄 문자열 만들기
prompt = """
1.Add
2.Del
3.List
4.Quit
Enter number: """

number = 0

while number != 4:
    print(prompt)
    number = int(input())
    # input 함수 : 값을 입력받는 함수 (내장함수)

while문을 보면 number가 4가 아닌 동안 prompt를 출력하고 사용자로부터 번호를 입력받는다.
다음의 결과 화면처럼 사용자가 4라는 값을 입력하지 않으면 계속해서 prompt를 출력한다.


(3) while문 강제로 빠져나가기

while문은 조건문이 참인 동안 계속해서 while문 안의 내용을 반복적으로 수행한다.
하지만 강제로 while문을 빠져나가고 싶을 때가 있다.

자판기 안에 커피가 충분히 있을 때에는 동전을 넣으면 커피가 나온다.
그런데 자판기가 제대로 작동하려면 커피가 얼마나 남았는지 항상 검사해야 한다.
만약 커피가 떨어졌다면 판매를 중단하고 “판매 중지”라는 문구를 사용자에게 보여주어야 한다.

# coffee는 10 잔, 돈은 300원
coffee = 10
money = 300

# 돈이 있는 동안은 계속해서 while문 내에 문장 실행
while money:
    print("돈을 받았으니 커피를 줍니다.")
    coffee = coffee -1
    print("남은 커피의 양은 %d개입니다." % coffee)
    
    # coffee가 없으면 더 팔 수 없음
    if coffee == 0:
        print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
        break

money가 300으로 고정되어 있으므로 while money:에서 조건문인 money는 0이 아니기 때문에 항상 참이다.
따라서 무한히 반복되는 무한 루프를 돌게 된다.

break문을 사용하면 while문을 빠져나갈 수 있다.


<Question 05>

「실제 커피 자판기를 만들어보자」

Hint01) while문을 사용한다.
Hint02) if문을 사용한다.
Hint03) 돈은 입력을 받고, 입력받는 함수는 input을 사용한다.
Hint04) 커피는 10개부터 시작하고, 한 잔에 300원이다.

coffee = 10
while True:
    money = int(input("돈을 넣어 주세요: "))

실제 출력 모습

돈을 넣어 주세요: 500
거스름돈 200를 주고 커피를 줍니다.
돈을 넣어 주세요: 300
커피를 줍니다.
돈을 넣어 주세요: 100
돈을 다시 돌려주고 커피를 주지 않습니다.
남은 커피의 양은 8개입니다.
돈을 넣어 주세요:


(4) while문의 맨 처음으로 돌아가기

while문 안의 문장을 수행할 때 입력된 조건을 검사해서 조건에 맞지 않으면 while문을 빠져나간다.
그런데 프로그래밍을 하다 보면 while문을 빠져나가지 않고 while문의 맨 처음(조건문)으로 다시 돌아가게 만들고 싶은 경우가 생기게 된다.
만약 1부터 10까지의 숫자 중에서 홀수만 출력하는 것을 while문을 이용해서 작성한다고 생각해 보자. 어떤 방법이 좋을까?

a = 0
while a < 10:
    a = a + 1
    if a % 2 == 0:
        # 짝수인 경우는 그냥 건너뛰고싶어..!
    print(a)

continue

continue문은 while문의 맨 처음으로 돌아가게 하는 명령어이다.


(5) 무한 루프

무한 루프란 무한히 반복한다는 의미이다.
우리가 사용하는 일반적인 프로그램 중에서 무한 루프의 개념을 사용하지 않는 프로그램은 거의 없다.
그만큼 자주 사용된다는 뜻이다.

while True: 
    수행할 문장1 
    수행할 문장2
    ...

while문의 조건문이 True이므로 항상 참이 된다.
따라서 while문 안에 있는 문장들은 무한하게 수행될 것이다.


<Question 06>

「3의 배수의 합」
1부터 1000까지의 자연수 중 3의 배수의 합을 구하시오.

Hint01) while문을 사용한다.
Hint02) 앞서 배웠던 operator와 조건문을 사용한다.

「50점 이상의 총합」
다음은 A학급 학생의 점수를 나타내는 리스트이다. 다음 리스트에서 50점 이상의 점수들의 총합을 구하시오.

Hint01) 리스트의 길이를 구하는 함수는 len()이다.
Hint02) 리스트의 마지막 항목을 뽑고, 리스트에서 제거하는 함수는 pop()이다.
mark = A.pop()
Hint03) while문의 무한 루프를 기억하자.

A = [20, 55, 67, 82, 45, 33, 90, 87, 100, 25]

「별 표시하기1」
while문을 이용하여 아래와 같이 별(*)을 표시하는 프로그램을 작성해 보자.

Hint01) break문을 사용한다.

*
**
***
****

To Home
To Lecture List