IT

[코딩온] 신재생에너지 IoT 개발자 입문_ 파이썬9

혈중당부족 2025. 12. 7. 16:34

11. while문

조건이 true 인 동안 코드 반복하는 반복문
조건이 false가 되면 반복을 멈춤
반복 힛수가 정해지지 않았을 때 사용
 
while 기본 문법
조건 : 참/거짓으로 구분할 수 있는 문장
 
while 조건:
    반복할 코드

블리언 표현식 사용, :과 들여쓰기 무조건 들어간다.

 

while문은 언제 유용하게 쓰일까, for, range와 다르게 반복 횟수가 필요하지 않고, 조건 기반 루프가 필요할 때.

또는 무한 루프+ 조건 분기 구조에도 쓰인다.(게임 진행, 서버대기와 같은 게 그런 예시다.)

 

 

사용할 때 주의 사항은, True 일 때까지 계속 반복시키기 때문에 조건을 누락하면 무한 루프에 빠진다. 그래서 작성 시, 반드시 종료 조건이 있어야 하며 만일 빠지면 'ctrl + c'로 실행 멈춘다.

 

 

예제1
light = "green"

while light == "green":
    print("계속 가세요")
    light = input("신호등의 신호를 입력하세요.(green/yellow/red): ")

print("중지!")
 
green 제외한 답 나올 때까지 계속 물어봄.


예제 2. 별도의 반복 변수를 정의
i = 0
while i < 5:
    print(i,"반복")
    i += 1
print("반복 종료")
 
반복할 때마다 1씩 추가 할당해서 5가 되면 멈춘다.
 
 
실습1 조건
1. 변수를 미리 설정.
2. 입력 받는 코드 작성, 입력한 값이 변수와 다를 경우 다시 입력하게 함.
3. 변수를 맞출 시 다른 문구 출력.
 
secret_code = "coodingonre3"
code = input("비밀 코드를 입력하세요.: ")
while code != secret_code:
    print("비밀 코드가 틀렸습니다.")
    code = input("비밀 코드를 입력하세요.: ")
print("입장이 허용되었습니다!")
 

#축약 버전
while code != secret_code:
    code = input("비밀 코드를 입력하세요.: ")
print("입장이 허용되었습니다!")
 
 
실습 2 조건
업다운 게임, 맞출 때 까지 답을 계속 입력한다.
1. 크면 크다고 출력, 작으면 작다고 출력
2. 맞출 시 입력 횟수를 기입해 맞췄다고 출력.
 
이건 답안 듣기 전에 다른 분들 코드와 서치 통해 직접 썼던 코드다.
N = int(input("숫자를 정합니다.(1~100): "))
try_count = 0

while True:
    A = int(input("답을 정합니다.(1~100): "))
    try_count += 1

    if A == N:
        print(f"{try_count}만에 정답을 맞췄습니다.")
        break
    elif A < N:
        print("입력한 숫자보다는 작아요.")
    elif A > N:
        print("입력한 숫자보다 커요.")
작성하면서 궁금했던 걸 생각에 써뒀는데 이 둘 정도가 떠올랐다.
- if 에서 true가 될 때를 상정하고 elif는 조건 벗어났을때(false)를 작성하는게 맞는 모양이다.
- true는 왜 붙이는 거지.
true는 지금 보니 논리가 참일 때 실행해라. 로 써두는 게 긴 조건 코드 작성에 유용해 보였다. 여러 조건을 쓰면 while 시작 코드 명을 못 쓸 게 분명하니 여러 조건이 전부 맞을 때, 의도 하고 쓰는 게 아녔을까. 
 
 

그 후 받은 강사님의 코드는 이랬다.

N = int(input("숫자를 정합니다.(1~100): "))
#import random 코드 쓸 수 있다. 이건 추후에 배울 예정이다.
# N = random.randint(1,100)
#print(N) 
A = 0 #사용자 입력 변수
try_count = 0 #횟수 변수

while A != N:
    A = int(input("1-100 사이의 수를 정합니다.: "))
    try_count += 1

    if A > N:
        print("입력한 숫자보다는 커요.")
    elif A < N:
        print("입력한 숫자보다 작아요.")

print(f"{try_count}만에 정답을 맞췄습니다.")

 

어차피 다음 코드 실행에서 횟수를 끌어 쓰면 되는 거니 while문 안에 꼭 넣을 필요가 없더라. 멈추면 카운트 된 변수가 나올테니까.

 

while True:를 언제 쓸까 생각하던 중에 정말로 나와버렸다. 이럴 때 루프를 따로 멈춰줄 코드를 써서 조절해야 한다.

 

루프 제어문 문법
running = True
while running:
    if 조건1:
        running = False

    if 조건2:
        running = False

break문
루프 탈출하는 명령어. 
while running:
    if 조건1:
        break

예제1
i = 0

while True:
    print(i, "실행")
    my_select = input("메뉴를 골라주세요.: ")

    if my_select == "종료":
        break

    i += 1

print("반복문 종료")
실행 결과

continue
이 조건일 때 실행하지 말고, 반복해라 할 때 쓴다.
 
홀수만 출력하는 코드 구조.
i = 0
while i < 5:
    i += 1
    if i % 2 == 0:
        continue
    print(i)
print("반복 종료")
1씩 더하다 짝수가 될때 넘기고, 진행한다.
if - else 구몬처럼 쓰는데 루프 종료 됐을 때 else를 실행한다.


 
실습
비밀 코드 입력
정답을 입력할 때까지 무한히 반복되며, 정확한 코드를 입력하면 루프를 탈출.
 
secret_code = "coodingonre3"
while True:
    code = input("비밀 코드를 입력하세요.: ")

    if code == secret_code:
        print("입장 완료!환영합니다.")
        break
    else:
        print("비밀 코드가 틀렸습니다. 다시 시도하세요.")
   
print("반복 종료")

 

 

#유효한 나이만 평균 내기
총 5명의 나이를 입력 받고, 유효한 나이만 평균 내서 출력.
나이 0 이하거나 120 초과일 시 무시하고 계산.
5명이 될 시 루프 종료하고 총합, 평균 출력.
 
 
times = 0
sum_age = 0


while True:
    age = int(input("나이를 입력하세요: "))

    if age <= 0 or age >= 120:
        continue
   
    times += 1
    sum_age += age

    if times == 5:
        break

avg = sum_age / times
print(f"총 나이 합계는 {sum_age}, 평균은 {avg} 입니다.")
 

- 후에 받은 모범 코드.
 
while times < 5:
    age = int(input("나이를 입력하세요: "))
    #나이가 0이하 또는 120 초과면 건너 뜀.
    if age <= 0 or age >= 120:
        continue
    # 정상 입력 시 코드.
    times += 1
    sum_age += age

print(f"총 나이 합계는 {sum_age}, 평균은 {int(sum_age / times)} 입니다.")

print에 계산식 가능하니 여기서 바로 해도 되는 거였다.

 

 

중첩 while 문

while 문 안에 또 while 문 쓸 수 있다. 반복문 안에서 또 다른 반복이 필요할 때 사용.

 

예제 코드: 구구단

dan = 2
while dan <= 9:
    num = 1
    print(f"[ {dan}단 ]")

    while num <= 9:
        num += 1
        if num % 2 != 0:
            continue #면 짝수 곱하기로 나오고 break 하면 해당 수만 하고 멈춤.
        else:
            print(f"{dan} X {num} = {dan * num}")
    num += 1

    print()
    dan += 1 #바깥 루프 조건 갱신

 

 

실습 예제: 로그인 시스템 구현

- 조건과 구조.

ID, 비밀번호 세팅

잘못 입력시 존재하지 않습니다 출력, 아이디 맞으면 비밀번호 입력.

실패시 비밀번호 틀렸다는 오류 출력 후 재입력.

둘다 맞으면 로그인 성공.

 

ID = "Re3_1234"
Pass_word = "56789"

while True:
    id = input("아이디를 입력하세요: ")
    if id == ID:
        while True:
            password = input("비밀번호를 입력하세요.: ")
           
            if password != Pass_word:
                print("비밀번호가 틀렸습니다.")

            else:
                print("로그인 성공")
                break
    else:
        print("ID가 존재하지 않습니다.")
    break

 

아이디 입력을 성공해야 내부 반복문 비밀번호 구조가 돌아가는 식으로 진행하고자 if 문을 앞서 넣어뒀다. (순차 진행이기 때문에.) 

 

이건 추가 실습 과제로 받았던 문제.

두 화면이 이어지도록 만드는 것이라서 비슷하게 만들고자 짠 코드는 이랬었다. 

ID = "abc123"
PW = "7789"

while True:
    print ("===로그인 화면===")
    In = input("1. 로그인 2. 종료 (1/2) 선택: ")

    if In == "1":
        id = input("아이디를 입력하세요: ")
        pw = input("비밀번호를 입력하세요.: ")

        if id != ID or pw != PW:
            print("로그인 실패! 다시 시도해주세요.")
            continue
        else:
            print("로그인 성공!")

            while True:
                print("=== 메뉴 ===")
                In_1 = input("1. 정보 보기 2. 설정 3. 로그아웃 (1/2/3): ")

                if In_1 == "1":
                    print("회원 정보 입니다.")

                elif In_1 == "2":
                    print("설정 메뉴 입니다.")
               
                else:
                    print("로그아웃 합니다.")
                    break
    else:
        print("프로그램을 종료합니다.")
        break

 

 

 

#후에 받은 코드들

ID = "abc123"
PW = "7789"

#아이디 먼저 검사
while True:
    id_input = input("아이디를 입력하세요.: ")

    if id_input != ID:
        print("ID가 일치하지 않습니다.")
        continue 

    while True:
        pw_input = input("비밀번호를 입력하세요.")

        if pw_input != PW:
            print("비밀번호가 일치하지 않습니다.")
            continue

        print("로그인 성공")
        break
    break

#문제 2
ID = "coodingon"
PW = "abc123"

while True:     # 전체 프로그램 반복
    print("=== 로그인 화면 ===")
    print("1. 로그인")
    print("2. 종료")
    main_sel = input("선택: ")
   
    if main_sel == "2":
        print("프로그램을 종료합니다.")
        break
    elif main_sel != "1": #만약에 어디에도 해당되지 않는 입력값이 나올 시의 조건문.
        print("잘못 선택하셨습니다.\n"
        continue

    # 로그인
    id_input = input("ID : ")
    pw_input = input("PW : ")
   
    if id_input != ID  or pw_input != PW:
        print("로그인 실패! 다시 시도해주세요.\n")
        continue
   
    print("로그인 성공!\n")
   
    # 로그인 후 메뉴 화면
    while True:
        print("=== 메뉴 ===")
        print("1. 정보 보기")
        print("2. 설정")
        print("3. 로그아웃")
        print("============")
           
        sel = input("메뉴 선택: ")
       
        if sel == "1":
            print("회원 정보입니다.\n")
            continue
        elif sel == "2":
            print("설정 메뉴입니다.\n")
            continue
        elif sel == "3":
            print("로그아웃합니다.\n")
            break  # 안쪽 while만 끊고 로그인 화면으로
        else:
            print("잘못 입력하셨습니다.\n") #만약에 어디에도 해당되지 않는 입력값이 나올 시의 조건문.
            continue
 
 
 
 
while문 복습까지 끝냈다. 하고 나니 어떤 구조든 조건이 맞고 실행이 된다면 돌아간다는 걸 새로 알아간 기분이다. 이전에 배운 if문도 섞어서 나오고 비교연산자, 논리연산자 조합으로 식이 진행되는 게 틀이 잡혔으니 자주 써봐야지... 이렇게 while 반복문까지 더해 반복문 구간을 넘어갔다.
이것도 기록 끝.