올바른 입력이 올 때까지 다시 묻는 코드는 **① 계속 묻기 → ② 바꿀 수 있는지 보기 → ③ 범위 맞으면 나가기**의 세 하위 목표로 짭니다.
try와 except에서는 잘못된 글자에 안내를 찍고 멈춤을 막았습니다. 맞는 값이 올 때까지 다시 물으려면 while과 추적 표, break와 continue, try / except를 한 틀로 묶습니다.
1다시 묻기 틀 — 하위 목표 셋
1~5 사이 정수를 받을 때까지 묻는 코드에 '열', '9', '3'을 넣은 실행입니다.
# 1. 계속 묻기
while True:
raw = input('1~5 사이 숫자: ')
# 2. 바꿀 수 있는지 보기
try:
n = int(raw)
except ValueError:
print('숫자로 적어 주세요')
continue
# 3. 범위 맞으면 나가기
if 1 <= n <= 5:
break
print('1~5 사이로 적어 주세요')
print('고른 숫자:', n)넣는 값열93
1~5 사이 숫자: 열
숫자로 적어 주세요
1~5 사이 숫자: 9
1~5 사이로 적어 주세요
1~5 사이 숫자: 3
고른 숫자: 3| 하위 목표 | 코드 | 역할 |
|---|---|---|
| ① 계속 묻기 | while True: · input(...) | 맞을 때까지 묻습니다. |
| ② 바꿀 수 있는지 | try / except · continue | 실패 시 돌아갑니다. |
| ③ 범위 맞으면 | if 1 <= n <= 5: break | 맞으면 나갑니다. |
int(raw)가 실패하면 정수 n이 없어 1 <= n <= 5를 비교할 수 없으므로, ②가 앞에 오고 실패 시 continue로 건너뜁니다.
2세 입력 흐름과 횟수 제한 경계
'열':int('열')에서ValueError가 나continue로 돌아갑니다.'9':1 <= 9 <= 5가False라break를 건너뜁니다.'3': 두 관문을 통과해break로 나갑니다.
이 틀은 횟수 제한 없이 기다릴 때 씁니다. 세 번만 기회를 줄 때는 for와 깃발(ok)을 씁니다. 무엇이 찍힐지 먼저 맞혀 보세요.
ok = False
for _ in range(3):
raw = input('숫자: ')
try:
n = int(raw)
ok = True
break
except ValueError:
print('숫자 아님')
print('성공:', ok)넣는 값가나다
실행 결과 보기
숫자: 가
숫자 아님
숫자: 나
숫자 아님
숫자: 다
숫자 아님
성공: False예상과 다르면 그곳이 배울 곳입니다. 세 번 모두 ValueError가 나 break를 만나지 못했고, range(3)이 끝나며 ok는 False로 남습니다.
예제
1 이상인 나이만 입력받기
둘째 관문을 age >= 1로 바꾸고 '스물', '-5', '20'을 넣은 결과입니다.
while True:
raw = input('나이: ')
try:
age = int(raw)
except ValueError:
print('숫자로 적어 주세요')
continue
if age >= 1:
break
print('1 이상으로 적어 주세요')
print('나이:', age)넣는 값스물-520
나이: 스물
숫자로 적어 주세요
나이: -5
1 이상으로 적어 주세요
나이: 20
나이: 20자주 틀리는 곳
1. except 안에 continue를 빼먹는다
틀린 생각: 안내를 찍었으니 continue가 없어도 다음 바퀴로 넘어간다.
except가 끝나면 바퀴도 끝난다고 여기기 쉽지만, continue가 없으면 바로 아래 if 1 <= n <= 5: 줄로 내려갑니다(규칙 1).
while True:
raw = input('숫자: ')
try:
n = int(raw)
except ValueError:
print('숫자 아님')
if 1 <= n <= 5:
break넣는 값열
숫자: 열숫자 아님Traceback (most recent call last): File "main.py", line 7, in <module> if 1 <= n <= 5: ^NameError: name 'n' is not definedint(raw)가 실패해 n이 없는데 7번 줄로 내려가 NameError로 멈추었습니다.
맞는 규칙: except ValueError: 안에는 continue를 넣어 아래 범위 검사를 건너뛰게 합니다.
2. 범위가 맞았을 때 break를 빼먹는다
틀린 생각: 맞는 값을 넣으면 while True:가 알아서 멈춘다.
값을 얻었으니 끝날 것 같지만, while True:는 break를 만나지 않으면 끝없이 돌아갑니다.
for raw in ['3', '4']:
n = int(raw)
if 1 <= n <= 5:
print('통과:', n)
print('바퀴 끝')
통과: 3
바퀴 끝
통과: 4
바퀴 끝'3'에서 조건이 True였는데도 break가 없어 멈추지 않고 다음 값까지 돌았습니다.
맞는 규칙: 두 관문을 모두 통과한 if 안에는 break를 두어 반복을 끝냅니다.
3. 왜 다시 묻는지 안내(print())를 안 찍는다
틀린 생각: 틀린 값이 들어왔을 때 조용히 다시 묻기만 해도 된다.
다시 묻는 것만으로 충분해 보이지만, 안내 없이 같은 질문만 뜨면 왜 거절되었는지 알 수 없습니다.
while True:
raw = input('1~5: ')
try:
n = int(raw)
except ValueError:
continue
if 1 <= n <= 5:
break
print('완료:', n)넣는 값열93
1~5: 열
1~5: 9
1~5: 3
완료: 3질문만 세 번 찍혀 숫자가 아닌지 범위가 틀렸는지 보이지 않습니다.
맞는 규칙: except 안과 범위 검사 뒤에는 왜 다시 묻는지 알리는 print()를 둡니다.
확인 문제
1. 다음 코드에 '가', '0', '2'를 차례대로 입력하면 무엇이 출력될까요?
while True:
raw = input('번호: ')
try:
n = int(raw)
except ValueError:
print('숫자 아님')
continue
if 1 <= n <= 3:
break
print('범위 밖')
print('선택:', n)넣는 값가02
힌트
첫 입력 '가'는 int(raw)에서 걸리고, 두 번째 입력 '0'은 int('0')은 통과하지만 1 <= 0 <= 3에서 걸립니다. 세 번째 입력 '2'는 두 관문을 모두 통과합니다.
정답
번호: 가
숫자 아님
번호: 0
범위 밖
번호: 2
선택: 2'가'에서는 '숫자 아님'이 찍힌 뒤 continue로 돌아가고, '0'에서는 '범위 밖'이 찍힌 뒤 돌아가며, '2'에서 break로 나와 '선택: 2'가 찍힙니다.
2. 빈칸을 채워 다시 묻기 코드를 완성하세요.
(가) 1부터 10 사이 숫자가 들어올 때까지 다시 묻는 코드입니다. int(raw)가 실패했을 때 아래 범위 검사를 건너뛰고 다음 바퀴로 돌아가도록 한 줄의 빈칸을 채우세요.
# 1. 계속 묻기
while True:
raw = input('1~10: ')
# 2. 바꿀 수 있는지 보기
try:
n = int(raw)
except ValueError:
print('숫자만 됩니다')
________
# 3. 범위 맞으면 나가기
if 1 <= n <= 10:
break
힌트
2번 하위 목표 '바꿀 수 있는지 보기'의 마지막 줄입니다. 이번 바퀴의 남은 줄을 건너뛰고 반복 머리로 돌아가는 키워드입니다.
정답
continue입니다.
while True:
raw = input('1~10: ')
try:
n = int(raw)
except ValueError:
print('숫자만 됩니다')
continue
if 1 <= n <= 10:
break
print(n)넣는 값열71~10: 열
숫자만 됩니다
1~10: 7
7흔한 오답은 break를 쓰는 것입니다. except 안에 break를 쓰면 잘못된 글자를 넣었을 때 다시 묻지 않고 반복이 그대로 끝나 버립니다.
(나) 0부터 100 사이의 점수(score)를 입력받는 코드입니다. 3번 하위 목표 '범위 맞으면 나가기'를 통째로 채우세요. 범위 밖이면 '0~100만 됩니다'를 찍어야 합니다.
# 1. 계속 묻기
while True:
raw = input('점수: ')
# 2. 바꿀 수 있는지 보기
try:
score = int(raw)
except ValueError:
print('숫자만 됩니다')
continue
# 3. 범위 맞으면 나가기
print('점수:', score)
힌트
1절 틀 코드의 3번 하위 목표 세 줄과 같습니다. 0 <= score <= 100이면 break로 나가고, 아니면 안내 문구를 찍습니다.
정답
while True:
raw = input('점수: ')
try:
score = int(raw)
except ValueError:
print('숫자만 됩니다')
continue
if 0 <= score <= 100:
break
print('0~100만 됩니다')
print('점수:', score)넣는 값15085점수: 150
0~100만 됩니다
점수: 85
점수: 85다르게 써도 되는 곳: 0 <= score <= 100은 score >= 0 and score <= 100으로 써도 같습니다.
흔한 오답은 if 안에 continue를 쓰는 것입니다. 범위가 맞았을 때 continue를 쓰면 반복이 끝나지 않고 또 묻게 됩니다.
3. 다음 코드는 양수(n > 0)가 들어올 때까지 다시 물으려 한 것인데, 첫 입력으로 '다섯'을 넣자 NameError로 멈추었습니다. 어디를 어떻게 고쳐야 할까요?
while True:
raw = input('양수: ')
try:
n = int(raw)
except ValueError:
print('숫자만 됩니다')
if n > 0:
break
print('0보다 커야 합니다')
힌트
'다섯'을 넣으면 int(raw)에서 ValueError가 나 n이 만들어지지 않습니다. except ValueError: 블록이 끝난 뒤 7번 줄 if n > 0:으로 내려가지 않게 막아 주는 한 줄이 빠졌습니다.
정답
except ValueError: 블록의 print('숫자만 됩니다') 바로 아래에 continue를 넣어야 합니다. 그래야 변환이 실패했을 때 if n > 0:을 건너뛰고 다시 입력받으러 올라갑니다.
while True:
raw = input('양수: ')
try:
n = int(raw)
except ValueError:
print('숫자만 됩니다')
continue
if n > 0:
break
print('0보다 커야 합니다')
print('통과:', n)넣는 값다섯3양수: 다섯
숫자만 됩니다
양수: 3
통과: 3아래 코드에서 범위 조건을 10 <= n <= 20으로 바꾸어 10부터 20 사이의 숫자만 통과하도록 고쳐 돌려 보세요.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
input()마다 위에서부터 한 줄씩 들어갑니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 넣은 값 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.