본문으로 건너뛰기

맞는 값이 올 때까지 다시 묻기

파이썬 목차오류와 예외레슨 47 / 59

목차

올바른 입력이 올 때까지 다시 묻는 코드는 **① 계속 묻기 → ② 바꿀 수 있는지 보기 → ③ 범위 맞으면 나가기**의 세 하위 목표로 짭니다.

try와 except에서는 잘못된 글자에 안내를 찍고 멈춤을 막았습니다. 맞는 값이 올 때까지 다시 물으려면 while과 추적 표, break와 continue, try / except를 한 틀로 묶습니다.

21단계 중 1단계. 1부터 5 사이 숫자가 들어올 때까지 다시 묻는 코드를 세 차례 입력('열', '9', '3')으로 따라갑니다.

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 defined

int(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)넣는 값열7
실행 결과
1~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를 받습니다.컴퓨터에서 해 보기

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로