Windows · Python 3.12.4. 본문의 첫 예제를 실행하여 표준 출력과 예상 결과가 일치함을 확인했습니다. 연습문제의 모든 입력을 검증한 것은 아닙니다.
이 글의 순서 5개 단락
하루 예산과 지출 금액을 입력받아 얼마나 썼고 얼마가 남았는지 계산해 봅시다. 지출을 입력할 때 글자나 음수를 잘못 넣어도 다시 입력할 수 있도록 만들겠습니다. 이 예제는 Python 3.12에서 표준 입력을 사용하며, 금액은 원 단위의 정수로 다룹니다.
입력을 확인하고 지출을 모으기
프로그램은 예산, 지출 항목 수, 각 항목의 금액을 차례로 받습니다. 세 종류의 입력 모두 0 이상의 정수여야 합니다. input이 받은 문자열을 int로 변환하고, 변환할 수 없거나 음수라면 안내한 뒤 같은 값을 다시 요청합니다.
while True는 조건이 항상 참인 반복문입니다. 여기서는 유효한 값이 들어올 때까지 입력을 반복하고, 함수의 return으로 유효한 값을 돌려주면서 반복도 끝냅니다. 입력 검증을 한 함수에 모으면 예산과 항목 수, 각 금액에 같은 기준을 적용할 수 있습니다.
def read_nonnegative_integer(prompt):
while True:
try:
value = int(input(prompt))
except ValueError:
print("0 이상의 정수를 입력하세요.")
else:
if value >= 0:
return value
print("0 이상의 정수를 입력하세요.")
def print_summary(budget, expenses):
total = 0
for expense in expenses:
total += expense
remaining = budget - total
print(f"총 지출: {total}원")
print(f"남은 예산: {remaining}원")
print(f"지출 항목 수: {len(expenses)}개")
budget = read_nonnegative_integer("예산: ")
count = read_nonnegative_integer("지출 항목 수: ")
expenses = []
for index in range(count):
expense = read_nonnegative_integer(f"{index + 1}번 지출: ")
expenses.append(expense)
print_summary(budget, expenses)

입력과 예상 결과
다음 순서로 입력한다고 가정합니다. 각 줄은 입력을 요청할 때 입력할 값 하나입니다.
10000
2
3000
4500
대화형 화면의 예상 모습은 다음과 같습니다. 안내 문구 뒤의 숫자는 사용자가 입력한 값입니다.
예산: 10000
지출 항목 수: 2
1번 지출: 3000
2번 지출: 4500
총 지출: 7500원
남은 예산: 2500원
지출 항목 수: 2개
3000과 4500이 리스트에 들어가고, 이를 더한 총 지출은 7500원입니다. 예산 10000원에서 총액을 빼면 2500원이 남습니다.
잘못된 입력이 있을 때도 살펴봅시다. 다음은 예산에 글자, 첫 번째 지출에 음수를 넣은 뒤 각각 올바른 값을 다시 입력하는 경우의 예상 모습입니다.
예산: 안녕
0 이상의 정수를 입력하세요.
예산: 5000
지출 항목 수: 1
1번 지출: -200
0 이상의 정수를 입력하세요.
1번 지출: 6000
총 지출: 6000원
남은 예산: -1000원
지출 항목 수: 1개
코드의 흐름과 경계 조건
int(input(prompt))에서 정수로 변환할 수 없는 값이 들어오면 ValueError가 발생하고 except의 안내가 출력됩니다. 새로 사용한 try의 else는 try 안에서 예외가 발생하지 않았을 때 실행됩니다. 변환에 성공한 값이 음수이면 return하지 않고 안내하므로, 다음 반복에서 같은 입력을 다시 요청합니다.
입력한 항목 수만큼 for문이 반복되고, 유효한 금액만 append로 리스트에 추가됩니다. range(count)는 0부터 시작하므로 화면에 표시할 순서에는 index + 1을 사용합니다. print_summary는 리스트의 금액을 하나씩 더합니다. total += expense는 앞에서 쓴 total = total + expense를 짧게 적은 형태로, 기존 합계에 현재 금액을 더해 다시 저장합니다. len(expenses)로 저장된 항목 수를 구합니다. len은 리스트에 들어 있는 항목의 개수를 돌려주는 내장 함수입니다.
주의할 점은 다음과 같습니다.
3.5, 빈 입력,1000원은int로 변환할 수 없어 다시 입력해야 합니다.0은 유효합니다.- 항목 수가
0이면 지출 입력을 건너뜁니다. 빈 리스트의 총액은0이고, 남은 예산은 입력한 예산과 같습니다. - 지출이 예산보다 크면 남은 예산이 음수로 출력됩니다. 예산을 얼마나 초과했는지 그 값으로 확인할 수 있습니다.
- 항목 수만큼 유효한 금액을 받습니다. 잘못된 값은 리스트에 추가되지 않으며 해당 항목을 다시 입력합니다.
- 입력이 중간에 끝나는 경우 발생하는
EOFError는 이 예제에서 처리하지 않습니다.
연습: 예산 초과 안내하기
print_summary에서 세 줄의 요약을 출력한 뒤, 남은 예산이 음수일 때만 예산을 초과했습니다.를 출력해 보세요. 예산이 총 지출과 같을 때는 안내하지 않아야 합니다.
풀이
print_summary의 마지막 print 아래에 같은 함수 들여쓰기로 다음을 추가합니다.
if remaining < 0:
print("예산을 초과했습니다.")
예산이 5000원이고 총 지출이 6000원이면 remaining은 -1000이므로 안내가 출력됩니다. 남은 예산이 0이면 조건이 거짓이므로 안내하지 않습니다.
참고 자료
- Python 3.12 내장 함수:
input,int,len,range의 동작 - Python 3.12 오류와 예외:
try,except,else를 이용한 예외 처리 - Python 3.12 제어 흐름 도구: 조건문, 반복문과 함수
CHECK THE SOURCE
참고한 공식 문서
기능 설명은 위 문서를 참고했으며, 예제의 입력·결과와 한계는 본문에 따로 기록했습니다.