HOWTO · Python
Python While 루프 사용자 입력
Python에서는 특정 조건이 만족될 때까지 데이터를 입력하기 위해 while 루프 내에서 input() 함수를 사용할 수 있습니다.
이 페이지의 내용
명령줄 프로그램에서 사용자가 지정한 단어나 메뉴 항목을 입력할 때까지 다시 물어야 한다면 Python의 input()을 while 루프 안에서 사용하세요. 각 응답을 문자열로 읽고, 계속할지 멈출지 확인한 다음, 유효한 값인지 검사한 뒤에 숫자로 변환합니다.
input() 함수 이해하기
Python 3에서 input()은 안내 문구를 표시하고 사용자가 Enter 키를 누를 때까지 기다린 뒤, 입력한 줄을 문자열로 반환합니다. 숫자처럼 보여도 반환값은 텍스트입니다. 예를 들어 12를 입력하면 정수 12가 아니라 문자열 "12"가 반환됩니다. 다음 연산에 숫자가 필요할 때만 int() 또는 float()로 변환하세요.
간단한 대화형 프로그램에서는 사용자가 무엇을 입력해야 하는지 알 수 있도록 안내 문구를 구체적으로 작성하세요. 응답은 문자열로 비교하거나 저장할 수 있고, 변환 함수에 전달할 수도 있습니다. input()을 한 번 호출하면 한 줄을 읽습니다. 이를 루프 안에 두면 응답을 반복해서 받을 수 있습니다. 루프를 추가하기 전에 한 번만 입력을 요청하고 응답하는 예제를 살펴보겠습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from io import StringIO
import sys
sys.stdin = StringIO("Ada\n")
name = input("What is your name? ")
print("Hello,", name)
What is your name? Hello, Ada
이 예제는 키보드 입력을 기다리지 않고 실행되도록 표준 입력을 통해 Ada를 제공합니다. 대화형 터미널에서 사용할 때는 StringIO와 sys.stdin 줄을 생략하세요. 그러면 input()이 사용자가 이름을 입력하고 Enter 키를 누를 때까지 기다린 뒤, 다음 줄에 인사말을 표시합니다. 코드 블록은 원문 그대로 보존되므로 프롬프트와 인사말은 영어로 표시됩니다.
while 루프로 입력 반복하기
sentinel은 done처럼 루프를 끝내도록 지정한 값입니다. 루프가 처음 실행되기 전에 조건을 확인할 수 있도록 값을 초기화하세요. 반복할 때마다 새 응답을 읽고 그 값으로 갱신합니다. 응답이 sentinel과 일치하면 다음 조건 검사에서 루프가 끝납니다. 유효한 데이터와 겹치지 않는 sentinel을 고르고 일관된 방식으로 비교하세요. 예를 들어 DONE도 종료 값으로 처리하려면 대소문자를 정규화합니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
responses = iter(["red", "blue", "done"])
def read_response(prompt):
print(prompt, end="")
response = next(responses)
print(response)
return response
answer = ""
while answer != "done":
answer = read_response("Enter a color (done to finish): ")
if answer != "done":
print("Saved:", answer)
Enter a color (done to finish): red
Saved: red
Enter a color (done to finish): blue
Saved: blue
Enter a color (done to finish): done
이 예제는 반복 가능한 상호작용을 보여 주기 위해 read_response를 통해 고정된 응답 순서를 제공합니다. 터미널 프로그램에서는 해당 헬퍼 호출을 input("Enter a color (done to finish): ")로 바꾸고 sentinel 비교와 루프 구조는 그대로 유지하세요. 루프는 sentinel을 읽지만 저장하지는 않습니다. 값을 갱신하는 코드를 빼면 조건이 계속 참으로 남아 루프가 끝없이 반복될 수 있으므로, 계속하는 각 반복에서 반드시 새 응답을 받아야 합니다. 코드 블록의 프롬프트와 출력 문구는 원문 그대로 보존되어 영어로 표시됩니다.
입력값 검증 구현하기
응답을 문자열로 읽고 숫자로 변환하기 전에 종료 sentinel인지 확인하세요. int()를 try/except ValueError 안에서 호출하면 변환에 실패했을 때 루프가 다시 입력을 요청하도록 할 수 있습니다. 이 독립 실행형 예제는 유효한 입력, 잘못된 입력, 종료 경로를 보여 주기 위해 고정된 응답 순서를 사용합니다. 대화형 터미널 프로그램에서는 read_response(...)를 input(...)으로 바꾸세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
responses = iter(["oops", "7", "exit"])
def read_response(prompt):
print(prompt, end="")
response = next(responses)
print(response)
return response
while True:
text = read_response("Enter an integer (exit to finish): ").strip()
if text.lower() == "exit":
break
try:
number = int(text)
except ValueError:
print("Please enter a whole number.")
continue
print("Accepted:", number)
Enter an integer (exit to finish): oops
Please enter a whole number.
Enter an integer (exit to finish): 7
Accepted: 7
Enter an integer (exit to finish): exit
sentinel을 int() 호출 전에 검사하므로 exit를 입력하면 변환을 시도하지 않고 루프가 끝납니다. ValueError가 발생한 뒤 continue는 입력 요청으로 돌아가며, 유효한 정수는 승인된 입력을 처리하는 분기로 전달됩니다. 3.5 같은 소수 문자열은 정수가 아니므로 소수 값을 허용하려면 float()을 사용하세요. strip()을 호출하면 앞뒤 공백을 허용할 수 있고, lower()를 사용하면 sentinel을 대소문자 구분 없이 비교할 수 있습니다. 코드 블록의 프롬프트와 출력 문구는 원문 그대로 보존되어 영어로 표시됩니다.
메뉴 기반 프로그램 만들기
메뉴 루프는 선택지를 표시하고, 각 선택을 문자열로 읽어 해당 동작을 수행한 뒤 명시적인 종료 옵션을 고를 때까지 반복합니다. 이 예제는 두 정수를 더하거나 뺍니다. 고정 응답에는 인식할 수 없는 선택, 두 연산의 선택, 종료 선택이 포함되어 있습니다. 터미널 프로그램에서는 read_response(...)를 input(...)으로 바꾸세요. 사용자가 임의의 피연산자를 입력할 수 있다면 앞서 설명한 정수 검증도 추가합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
responses = iter(["x", "1", "4", "5", "2", "9", "3", "3"])
def read_response(prompt):
print(prompt, end="")
response = next(responses)
print(response)
return response
while True:
print("1) Add 2) Subtract 3) Exit")
choice = read_response("Choice: ")
if choice == "3":
print("Goodbye.")
break
elif choice == "1":
left = int(read_response("First number: "))
right = int(read_response("Second number: "))
print("Result:", left + right)
elif choice == "2":
left = int(read_response("First number: "))
right = int(read_response("Second number: "))
print("Result:", left - right)
else:
print("Choose 1, 2, or 3.")
1) Add 2) Subtract 3) Exit
Choice: x
Choose 1, 2, or 3.
1) Add 2) Subtract 3) Exit
Choice: 1
First number: 4
Second number: 5
Result: 9
1) Add 2) Subtract 3) Exit
Choice: 2
First number: 9
Second number: 3
Result: 6
1) Add 2) Subtract 3) Exit
Choice: 3
Goodbye.
종료 분기는 두 피연산자를 묻기 전에 실행되며, 인식할 수 없는 선택에는 안내를 출력한 뒤 다음 메뉴를 표시합니다. 유효한 연산을 선택하면 숫자 두 개를 읽고 결과를 보여 줍니다. 같은 구조로 함수를 호출하거나 설정을 갱신하고 정보를 표시할 수도 있습니다. 여러 곳에서 사용하는 검증 로직은 헬퍼 함수로 옮길 수 있습니다. 코드 블록의 메뉴, 프롬프트와 출력 문구는 원문 그대로 보존되어 영어로 표시됩니다.
Python 2 레거시 코드의 입력
Python 2는 지원이 종료된 레거시 런타임이며, Python Software Foundation의 Python 2 종료 안내에 따르면 2020년 1월 1일에 수명이 끝났습니다. Python 2에서 raw_input()은 한 줄을 읽어 텍스트로 반환하지만, input()은 입력한 표현식을 평가합니다. Python 3에서는 input()이 텍스트를 반환하므로 동작이 다릅니다. 텍스트 입력을 기대하는 오래된 Python 2 코드를 유지 관리한다면 해당 함수는 raw_input()입니다. Python 3의 input() 동작을 그 코드에 그대로 적용하지 마세요. 새 프로그램에는 Python 3과 그 버전의 input()을 사용하세요.