Windows · Python 3.12.4. 본문의 첫 예제를 실행하여 표준 출력과 예상 결과가 일치함을 확인했습니다. 연습문제의 모든 입력을 검증한 것은 아닙니다.
이 글의 순서 5개 단락
계산을 여러 번 하면 앞에서 구한 결과를 다시 보고 싶을 때가 있습니다. 이번에는 계산에 성공할 때마다 식과 결과를 리스트에 저장하고, 기록 명령으로 한꺼번에 확인합니다. 환경은 Python 3.12이며, 프로그램을 종료할 때까지만 기록을 유지합니다.
계산 기록을 리스트에 담기
리스트는 여러 값을 순서대로 담는 자료형입니다. []는 비어 있는 리스트를 만들고, history.append(기록)은 새 항목을 리스트의 끝에 추가합니다. for 반복문으로 항목을 하나씩 꺼내면 추가한 순서대로 출력할 수 있습니다.
핵심은 빈 리스트를 계산을 반복하는 while 문 밖에서 한 번만 만드는 것입니다. 반복문 안에서 매번 만들면 새 명령을 받을 때마다 이전 기록이 사라집니다.
기록을 남기는 계산기
연산자에 +, -, *, /를 입력하면 두 수를 받습니다. 기록은 저장된 계산을 보여 주고, 종료는 프로그램을 마칩니다. 숫자를 변환할 수 없거나 0으로 나누려 하면 안내한 뒤 다시 명령을 받습니다.
def calculate(first, operator, second):
if operator == "+":
return first + second
if operator == "-":
return first - second
if operator == "*":
return first * second
if operator == "/":
if second == 0:
return None
return first / second
history = []
while True:
operator = input("연산자 (+, -, *, /, 기록, 종료): ").strip()
if operator == "종료":
print("계산기를 종료합니다.")
break
if operator == "기록":
if not history:
print("계산 기록이 없습니다.")
else:
print("계산 기록:")
for entry in history:
print(entry)
continue
if operator not in ("+", "-", "*", "/"):
print("지원하지 않는 명령입니다.")
continue
try:
first = float(input("첫 번째 수: "))
second = float(input("두 번째 수: "))
except ValueError:
print("숫자를 입력해 주세요.")
continue
result = calculate(first, operator, second)
if result is None:
print("0으로 나눌 수 없습니다.")
continue
entry = f"{first} {operator} {second} = {result}"
history.append(entry)
print(entry)

다음 입력을 한 줄씩 순서대로 넣어 보세요. 처음에는 빈 기록을 확인하고, 두 번 계산한 다음 잘못된 숫자와 0으로 나누는 경우를 거쳐 기록을 확인합니다.
기록
+
2
3
*
4
5
+
abc
/
8
0
기록
종료
입력값이 터미널에 표시되는 방식은 실행 환경에 따라 다릅니다. 아래는 입력 자체를 되풀이해 표시하지 않는 환경에서 예상되는 표준 출력입니다. input()의 안내 문구는 줄바꿈 없이 출력되므로 다음 안내나 결과와 이어집니다.
연산자 (+, -, *, /, 기록, 종료): 계산 기록이 없습니다.
연산자 (+, -, *, /, 기록, 종료): 첫 번째 수: 두 번째 수: 2.0 + 3.0 = 5.0
연산자 (+, -, *, /, 기록, 종료): 첫 번째 수: 두 번째 수: 4.0 * 5.0 = 20.0
연산자 (+, -, *, /, 기록, 종료): 첫 번째 수: 숫자를 입력해 주세요.
연산자 (+, -, *, /, 기록, 종료): 첫 번째 수: 두 번째 수: 0으로 나눌 수 없습니다.
연산자 (+, -, *, /, 기록, 종료): 계산 기록:
2.0 + 3.0 = 5.0
4.0 * 5.0 = 20.0
연산자 (+, -, *, /, 기록, 종료): 계산기를 종료합니다.
결과가 저장되는 흐름
calculate()는 두 수와 연산자를 받아 결과를 반환합니다. 나눗셈의 두 번째 수가 0이면 계산 결과 대신 None을 반환합니다. None은 여기서 결과가 없다는 표시로 사용합니다. 호출한 쪽은 result is None을 확인해 안내하고, continue로 현재 반복의 나머지를 건너뜁니다.
정상 결과가 있을 때만 f-문자열로 식과 결과를 하나의 문자열 entry로 만든 뒤 history.append(entry)를 실행합니다. 따라서 숫자 변환 실패와 0 나누기는 기록에 추가되지 않습니다. 기록 명령을 받으면 if not history로 빈 리스트인지 확인하고, 항목이 있다면 for entry in history로 각각 출력합니다.
입력한 정수도 float()로 변환하므로 기록에 2.0처럼 표시됩니다. 연산자 입력의 strip()은 앞뒤 공백을 제거합니다. operator not in (...)은 입력이 괄호 안의 허용된 연산자 중 하나가 아닌지 확인합니다.
실수와 경계 조건
- 결과가
0.0일 수도 있으므로if not result로 오류를 판별하면 정상적인 0도 오류로 취급합니다. 결과가 없다는 표시인None을is None으로 확인하세요. - 잘못된 숫자를 입력하면 해당 계산을 처음부터 다시 시작합니다. 첫 번째 수가 잘못되면 두 번째 수는 묻지 않습니다.
- 지원하지 않는 명령은 숫자를 입력받기 전에 거절합니다. 기록 보기와 종료도 숫자를 묻지 않습니다.
- 기록은 프로그램이 실행되는 동안 메모리에만 남습니다. 종료 후 다시 시작하면 빈 리스트에서 출발합니다.
float()는nan과inf같은 특수값도 받아들입니다. 이 예제는 이를 별도로 제한하지 않으며, 실수 연산에는 반올림 오차가 나타날 수 있습니다.
연습: 기록 개수 표시하기
기록 명령을 입력했을 때 저장된 계산이 있다면 목록을 출력하기 전에 총 2건처럼 개수를 표시해 보세요. 기록이 없을 때는 기존 안내를 유지합니다.
풀이: else 안의 print("계산 기록:") 앞에 print(f"총 {len(history)}건")을 추가합니다. len(history)는 리스트에 들어 있는 항목의 개수를 반환합니다. 성공한 계산 두 건이 있다면 목록 앞에 총 2건이 표시됩니다.
리스트와 append()의 동작은 Python 3.12 공식 문서의 자료구조 설명을 참고하세요.
CHECK THE SOURCE
참고한 공식 문서
기능 설명은 위 문서를 참고했으며, 예제의 입력·결과와 한계는 본문에 따로 기록했습니다.