while문은 언제 유용하게 쓰일까, for, range와 다르게 반복 횟수가 필요하지 않고, 조건 기반 루프가 필요할 때.
또는 무한 루프+ 조건 분기 구조에도 쓰인다.(게임 진행, 서버대기와 같은 게 그런 예시다.)
사용할 때 주의 사항은, True 일 때까지 계속 반복시키기 때문에 조건을 누락하면 무한 루프에 빠진다. 그래서 작성 시, 반드시 종료 조건이 있어야 하며 만일 빠지면 'ctrl + c'로 실행 멈춘다.
예제1
light="green"
whilelight=="green":
print("계속 가세요")
light=input("신호등의 신호를 입력하세요.(green/yellow/red): ")
print("중지!")
green 제외한 답 나올 때까지 계속 물어봄.
예제 2. 별도의 반복 변수를 정의
i=0
whilei<5:
print(i,"반복")
i+=1
print("반복 종료")
반복할 때마다 1씩 추가 할당해서 5가 되면 멈춘다.
실습1 조건
1. 변수를 미리 설정.
2. 입력 받는 코드 작성, 입력한 값이 변수와 다를 경우 다시 입력하게 함.
3. 변수를 맞출 시 다른 문구 출력.
secret_code="coodingonre3"
code=input("비밀 코드를 입력하세요.: ")
whilecode!=secret_code:
print("비밀 코드가 틀렸습니다.")
code=input("비밀 코드를 입력하세요.: ")
print("입장이 허용되었습니다!")
#축약 버전
whilecode!=secret_code:
code=input("비밀 코드를 입력하세요.: ")
print("입장이 허용되었습니다!")
실습 2 조건
업다운 게임, 맞출 때 까지 답을 계속 입력한다.
1. 크면 크다고 출력, 작으면 작다고 출력
2. 맞출 시 입력 횟수를 기입해 맞췄다고 출력.
이건 답안 듣기 전에 다른 분들 코드와 서치 통해 직접 썼던 코드다.
N=int(input("숫자를 정합니다.(1~100): "))
try_count=0
whileTrue:
A=int(input("답을 정합니다.(1~100): "))
try_count+=1
ifA==N:
print(f"{try_count}만에 정답을 맞췄습니다.")
break
elifA<N:
print("입력한 숫자보다는 작아요.")
elifA>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#횟수 변수
whileA!=N:
A=int(input("1-100 사이의 수를 정합니다.: "))
try_count+=1
ifA>N:
print("입력한 숫자보다는 커요.")
elifA<N:
print("입력한 숫자보다 작아요.")
print(f"{try_count}만에 정답을 맞췄습니다.")
어차피 다음 코드 실행에서 횟수를 끌어 쓰면 되는 거니 while문 안에 꼭 넣을 필요가 없더라. 멈추면 카운트 된 변수가 나올테니까.
while True:를 언제 쓸까 생각하던 중에 정말로 나와버렸다. 이럴 때 루프를 따로 멈춰줄 코드를 써서 조절해야 한다.
루프 제어문 문법
running=True
whilerunning:
if 조건1:
running=False
if 조건2:
running=False
break문
루프 탈출하는 명령어.
whilerunning:
if 조건1:
break
예제1
i=0
whileTrue:
print(i, "실행")
my_select=input("메뉴를 골라주세요.: ")
ifmy_select=="종료":
break
i+=1
print("반복문 종료")
실행 결과
continue
이 조건일 때 실행하지 말고, 반복해라 할 때 쓴다.
홀수만 출력하는 코드 구조.
i=0
whilei<5:
i+=1
ifi%2==0:
continue
print(i)
print("반복 종료")
1씩 더하다 짝수가 될때 넘기고, 진행한다.if - else 구몬처럼 쓰는데 루프 종료 됐을 때 else를 실행한다.
실습
비밀 코드 입력
정답을 입력할 때까지 무한히 반복되며, 정확한 코드를 입력하면 루프를 탈출.
secret_code="coodingonre3"
whileTrue:
code=input("비밀 코드를 입력하세요.: ")
ifcode==secret_code:
print("입장 완료!환영합니다.")
break
else:
print("비밀 코드가 틀렸습니다. 다시 시도하세요.")
print("반복 종료")
#유효한 나이만 평균 내기
총 5명의 나이를 입력 받고, 유효한 나이만 평균 내서 출력.
나이 0 이하거나 120 초과일 시 무시하고 계산.
5명이 될 시 루프 종료하고 총합, 평균 출력.
times=0
sum_age=0
whileTrue:
age=int(input("나이를 입력하세요: "))
ifage<=0orage>=120:
continue
times+=1
sum_age+=age
iftimes==5:
break
avg=sum_age/times
print(f"총 나이 합계는 {sum_age}, 평균은 {avg} 입니다.")
- 후에 받은 모범 코드.
whiletimes<5:
age=int(input("나이를 입력하세요: "))
#나이가 0이하 또는 120 초과면 건너 뜀.
ifage<=0orage>=120:
continue
# 정상 입력 시 코드.
times+=1
sum_age+=age
print(f"총 나이 합계는 {sum_age}, 평균은 {int(sum_age/times)} 입니다.")
print에 계산식 가능하니 여기서 바로 해도 되는 거였다.
중첩 while 문
while 문 안에 또 while 문 쓸 수 있다. 반복문 안에서 또 다른 반복이 필요할 때 사용.
예제 코드: 구구단
dan=2
whiledan<=9:
num=1
print(f"[ {dan}단 ]")
whilenum<=9:
num+=1
ifnum%2!=0:
continue#면 짝수 곱하기로 나오고 break 하면 해당 수만 하고 멈춤.
else:
print(f"{dan} X {num} = {dan*num}")
num+=1
print()
dan+=1 #바깥 루프 조건 갱신
실습 예제: 로그인 시스템 구현
- 조건과 구조.
ID, 비밀번호 세팅
잘못 입력시 존재하지 않습니다 출력, 아이디 맞으면 비밀번호 입력.
실패시 비밀번호 틀렸다는 오류 출력 후 재입력.
둘다 맞으면 로그인 성공.
ID="Re3_1234"
Pass_word="56789"
whileTrue:
id=input("아이디를 입력하세요: ")
ifid==ID:
whileTrue:
password=input("비밀번호를 입력하세요.: ")
ifpassword!=Pass_word:
print("비밀번호가 틀렸습니다.")
else:
print("로그인 성공")
break
else:
print("ID가 존재하지 않습니다.")
break
아이디 입력을 성공해야 내부 반복문 비밀번호 구조가 돌아가는 식으로 진행하고자 if 문을 앞서 넣어뒀다. (순차 진행이기 때문에.)
이건 추가 실습 과제로 받았던 문제.
두 화면이 이어지도록 만드는 것이라서 비슷하게 만들고자 짠 코드는 이랬었다.
ID="abc123"
PW="7789"
whileTrue:
print ("===로그인 화면===")
In=input("1. 로그인 2. 종료 (1/2) 선택: ")
ifIn=="1":
id=input("아이디를 입력하세요: ")
pw=input("비밀번호를 입력하세요.: ")
ifid!=IDorpw!=PW:
print("로그인 실패! 다시 시도해주세요.")
continue
else:
print("로그인 성공!")
whileTrue:
print("=== 메뉴 ===")
In_1=input("1. 정보 보기 2. 설정 3. 로그아웃 (1/2/3): ")
ifIn_1=="1":
print("회원 정보 입니다.")
elifIn_1=="2":
print("설정 메뉴 입니다.")
else:
print("로그아웃 합니다.")
break
else:
print("프로그램을 종료합니다.")
break
#후에 받은 코드들
ID="abc123"
PW="7789"
#아이디 먼저 검사
whileTrue:
id_input=input("아이디를 입력하세요.: ")
ifid_input!=ID:
print("ID가 일치하지 않습니다.")
continue
whileTrue:
pw_input=input("비밀번호를 입력하세요.")
ifpw_input!=PW:
print("비밀번호가 일치하지 않습니다.")
continue
print("로그인 성공")
break
break
#문제 2
ID="coodingon"
PW="abc123"
whileTrue: # 전체 프로그램 반복
print("=== 로그인 화면 ===")
print("1. 로그인")
print("2. 종료")
main_sel=input("선택: ")
ifmain_sel=="2":
print("프로그램을 종료합니다.")
break
elifmain_sel!="1": #만약에 어디에도 해당되지 않는 입력값이 나올 시의 조건문.
print("잘못 선택하셨습니다.\n")
continue
# 로그인
id_input=input("ID : ")
pw_input=input("PW : ")
ifid_input!=IDorpw_input!=PW:
print("로그인 실패! 다시 시도해주세요.\n")
continue
print("로그인 성공!\n")
# 로그인 후 메뉴 화면
whileTrue:
print("=== 메뉴 ===")
print("1. 정보 보기")
print("2. 설정")
print("3. 로그아웃")
print("============")
sel=input("메뉴 선택: ")
ifsel=="1":
print("회원 정보입니다.\n")
continue
elifsel=="2":
print("설정 메뉴입니다.\n")
continue
elifsel=="3":
print("로그아웃합니다.\n")
break# 안쪽 while만 끊고 로그인 화면으로
else:
print("잘못 입력하셨습니다.\n") #만약에 어디에도 해당되지 않는 입력값이 나올 시의 조건문.
continue
while문 복습까지 끝냈다. 하고 나니 어떤 구조든 조건이 맞고 실행이 된다면 돌아간다는 걸 새로 알아간 기분이다. 이전에 배운 if문도 섞어서 나오고 비교연산자, 논리연산자 조합으로 식이 진행되는 게 틀이 잡혔으니 자주 써봐야지... 이렇게 while 반복문까지 더해 반복문 구간을 넘어갔다.