score = int(input('점수 입력: '))
if score >= 90:
grade = 'A'
elif 80 <= score < 90:
grade = 'B'
elif 70 <= score < 80:
grade = 'C'
elif 60 <= score < 70:
grade = 'D'
else:
grade = 'F'
print(f'{score}점은 {grade}학점')
이 소스를 실행파일을 만들어서 계속 사용할 수 있게 소스를 수정하기
입력값을 계속해서 받으려면 while True: 무한 루프를 사용해야 합니다. 사용자가 'exit'와 같은 특정 값을 입력하면 프로그램이 종료되도록 만들 수 있습니다.
소스 수정
요청하신 소스를 계속해서 점수를 입력받는 형태로 수정하고, os.system('pause') 대신 무한 루프를 적용했습니다. os 모듈은 더 이상 필요하지 않습니다.
# 점수를 계속 입력받는 프로그램
while True:
try:
# 사용자에게 점수 입력을 요청합니다.
user_input = input('점수 입력 (종료: q): ')
# 사용자가 'q'를 입력하면 루프를 종료합니다.
if user_input.lower() == 'q':
print("프로그램을 종료합니다.")
break
# 입력값을 정수로 변환합니다.
score = int(user_input)
# 점수에 따라 학점을 계산합니다.
if score >= 90:
grade = 'A'
elif 80 <= score < 90:
grade = 'B'
elif 70 <= score < 80:
grade = 'C'
elif 60 <= score < 70:
grade = 'D'
else:
grade = 'F'
print(f'{score}점은 {grade}학점 입니다.')
except ValueError:
# 숫자가 아닌 다른 값을 입력했을 때 오류 메시지를 출력합니다.
print("잘못된 입력입니다. 점수 또는 'q'를 입력해 주세요.")
except Exception as e:
# 예상치 못한 다른 오류가 발생했을 때 처리합니다.
print(f"오류가 발생했습니다: {e}")
이 코드를 test.py 파일로 저장하세요. 이제 이 소스 파일을 가지고 PyInstaller로 실행 파일(.exe)을 만들면 됩니다.
여기 소스에서 주의할 점은 IDLE Shell에서는 소스 타이핑할 때 주의해야할 점이 있다.
try: 이 구문과 except 이 구문의 들여쓰기 위치가 같아야 한다. 같지 않으면 계속 에러를 경험했다.
고수들은 빨리 알았겠지만, except구문을 타이핑할때 try구문과 동일 선상이 아니였다. 약간 더 들여쓴거 같은데, 계속 에러가 나서 당황했다. 혹시 이 코드를 직접 타이핑해서 작업하는 분은 주의 하기 바랍니다.
초보일때는 꼭 타이핑해서 이런 사소한 에러 경험을 꼭 쌓아야 합니다.
그냥 복사 붙여넣기로만 한다면, 정말 사소한 에러를 찾는데, 경험치가 없다면, 나중에 혼란스러울 수 있겠다고 생각했습니다.
실행 파일 만들기
- 수정한 test.py 파일이 있는 경로로 이동합니다.
- 명령 프롬프트(CMD)를 엽니다.
- 아래 명령어를 입력하여 실행 파일을 생성합니다.
pyinstaller -F test.py
이제 dist 폴더 안에 있는 test.exe 파일을 실행하면, CMD 창이 닫히지 않고 점수 입력을 계속해서 받을 수 있습니다. 💻
소스해석을 두가지로 설명해둠
첫번째 해석)
이 파이썬 코드는 사용자에게 점수를 입력받아 학점을 계산하고 출력하는 프로그램입니다. 프로그램은 사용자가 'q'를 입력할 때까지 반복되며, 잘못된 입력에 대한 예외 처리 기능도 포함하고 있습니다.
1. while True:
while True:는 무한 루프를 시작하는 구문입니다. 조건이 항상 참(True)이므로, 루프는 break 문을 만나기 전까지 계속해서 반복됩니다. 이 코드는 사용자가 프로그램을 직접 종료할 때까지 계속 점수를 입력받기 위해 사용됩니다.
2. try...except 블록
try 블록 안의 코드는 실행 중에 오류(예외)가 발생할 가능성이 있는 부분을 감싸줍니다. 만약 오류가 발생하면, 프로그램은 멈추지 않고 즉시 해당하는 except 블록으로 이동하여 지정된 오류 처리 코드를 실행합니다. 이 프로그램에서는 두 가지 종류의 오류를 처리합니다.
- ValueError: int(user_input) 부분에서 숫자로 변환할 수 없는 문자열(예: 'abc')을 입력했을 때 발생하는 오류입니다. 이 경우 "잘못된 입력입니다..."라는 메시지를 출력합니다.
- Exception: ValueError를 제외한 모든 예상치 못한 오류를 포괄적으로 처리합니다. 예를 들어, 메모리 부족과 같은 시스템 오류가 발생했을 때 이 블록이 실행됩니다.
3. 사용자 입력 및 종료
user_input = input('점수 입력(종료:q): ')는 사용자에게 메시지를 보여주고 키보드 입력을 받습니다. 입력받은 값은 user_input 변수에 문자열 형태로 저장됩니다.
if user_input.lower() == 'q':는 사용자가 'q' 또는 'Q'를 입력했는지 확인합니다. .lower()는 입력값을 소문자로 변환하여 대소문자 구분 없이 'q'를 인식하게 합니다. 조건이 참이면, "프로그램을 종료합니다"를 출력하고 break 문을 실행하여 while 루프를 빠져나오게 됩니다.
4. 학점 계산 및 출력
사용자가 'q'가 아닌 다른 값을 입력하면, score = int(user_input)를 통해 입력받은 문자열을 정수(integer)로 변환합니다. 여기서 숫자가 아닌 값이 입력되면 위에서 설명한 ValueError가 발생합니다.
이후 if...elif...else 조건문을 사용하여 학점을 계산합니다. 이 구조는 여러 조건을 순차적으로 검사하며, 가장 먼저 참이 되는 조건의 블록을 실행하고 나머지 조건들은 건너뜁니다.
- if score >= 90:: 점수가 90점 이상이면 'A' 학점.
- elif 80 <= score < 90:: 앞의 조건이 거짓이고, 점수가 80점 이상 90점 미만이면 'B' 학점.
- elif 70 <= score < 80:: 앞의 조건들이 거짓이고, 점수가 70점 이상 80점 미만이면 'C' 학점.
- elif 60 <= score < 70:: 앞의 조건들이 거짓이고, 점수가 60점 이상 70점 미만이면 'D' 학점.
- else:: 위의 모든 조건이 거짓이면, 즉 점수가 60점 미만이면 'F' 학점.
마지막으로 print(f'{score}점은 {grade}학점 입니다.')는 f-string을 사용하여 계산된 점수와 학점을 하나의 문자열로 보기 좋게 조합하여 출력합니다.
두번째 해석)
코드는 “점수 → 학점”을 반복해서 계산하다가 사용자가 q 를 입력하면 끝나는 작은 콘솔 프로그램입니다. 한 번에 쭉 훑은 뒤, 줄단위로 아주 자세히 풀어볼게요.
1) 전체 동작 요약
- while True:로 무한 반복을 시작합니다.
- 매 반복에서 input()으로 문자열을 입력받습니다.
- 입력이 'q'(대소문자 무시)면 종료합니다.
- 아니면 int()로 정수로 바꿉니다. (실패하면 ValueError 예외 처리)
- 점수 구간에 따라 A/B/C/D/F를 정하고 출력합니다.
- 예외가 나면 친절한 안내 메시지를 띄우고 다음 반복으로 넘어갑니다.
2) 줄단위로 자세한 설명
while True:
무한 루프를 엽니다. break를 만나기 전까지 계속 반복합니다.
반복적으로 여러 점수를 입력받기 위해 사용합니다.
try:
예외 처리 블록 시작.
try 안에서 오류가 나면 아래의 except로 흐름이 넘어갑니다.
여기서는 주로 int() 변환 실패(ValueError)를 다룹니다.
user_input = input('점수 입력(종료:q): ')
사용자에게 문자열을 입력받습니다.
input()은 항상 문자열을 반환합니다(예: "95", "q", "89.5", "abc" 등).
if user_input.lower() == 'q':
print("프로그램을 종료합니다")
break
사용자가 대문자/소문자 구분 없이 q를 입력했는지 검사합니다.
user_input.lower()는 입력 전체를 소문자로 바꿉니다.
예: "Q", "q", "Q\n"(개행 제외 시) 같은 경우도 대응하려면 .strip().lower()를 쓰면 더 안전합니다.
q면 종료 메시지를 출력하고 break로 루프를 탈출합니다.
score = int(user_input)
문자열을 정수로 변환합니다.
변환에 실패하면 ValueError가 발생하여 아래 except ValueError:로 이동합니다.
예: "89.5", "ninety", ""(빈 문자열), " " 등의 입력은 ValueError.
if score >= 90:
grade = 'A'
elif 80 <= score < 90:
grade = 'B'
elif 70 <= score < 80:
grade = 'C'
elif 60 <= score < 70:
grade = 'D'
else:
grade = 'F'
구간별 분기로 학점을 결정합니다.
elif 80 <= score < 90 같은 연쇄 비교(chained comparison) 문법을 사용했습니다.
이는 (80 <= score) and (score < 90)와 같습니다.
현재 코드는 점수 범위 제한(0~100) 은 두지 않았습니다.
예: 105를 넣어도 조건에 맞아 A가 됩니다.
필요하다면 if not (0 <= score <= 100): ...로 범위를 검사할 수 있습니다.
print(f'{score}점은 {grade}학점 입니다.')
f-string으로 포맷팅하여 결과를 출력합니다.
중괄호 {} 안에 변수명을 넣으면 그 값이 문자열에 삽입됩니다.
except ValueError:
print("잘못된 입력입니다. 점수 또는 'q'를 입력해주세요.")
int(user_input) 단계에서 변환 실패 시 실행됩니다.
사용자가 점수(정수)나 q만 입력하도록 안내합니다.
except Exception as e:
print(f'오류가 발생했습니다. {e}')
그 밖의 모든 예외(일반적인 Exception 계열)를 잡습니다.
예상치 못한 오류 메시지를 보여줍니다.
참고: KeyboardInterrupt(Ctrl+C)나 SystemExit는 BaseException 쪽이라 여기서 잡히지 않습니다.
3) 실행 예시
- 정상 입력
점수 입력(종료:q): 95
95점은 A학점 입니다.
점수 입력(종료:q): 83
83점은 B학점 입니다.
잘못된 입력 (정수가 아님)
점수 입력(종료:q): 89.5
잘못된 입력입니다. 점수 또는 'q'를 입력해주세요.
종료
점수 입력(종료:q): q
프로그램을 종료합니다
4) 자주 헷갈리는 포인트
- input()은 항상 문자열을 줍니다 → 숫자로 쓰려면 int()(또는 float()) 변환이 필요.
- 대소문자 무시는 lower()(또는 upper())로 처리.
- 연쇄 비교 80 <= score < 90는 파이썬만의 문법으로, (80 <= score) and (score < 90)와 동일.
- 현재 코드는 음수/100점 초과도 받아들입니다. 필요하면 범위 검사를 추가하세요.
- "89.5" 같은 소수 입력은 int() 변환이 안 됩니다. 소수도 받으려면 float()로 바꾸고 범위를 체크한 뒤 반올림/내림 규칙을 정하세요.
5) 품질/안정성 향상 아이디어 (선택)
- 공백/대소문자/잡입력에 더 강하게
user_input = input('점수 입력(종료:q): ').strip()
if user_input.lower() == 'q':
...
2. 점수 범위(0~100) 강제
score = int(user_input)
if not (0 <= score <= 100):
print("0~100 사이의 정수를 입력해주세요.")
continue
3. 소수 허용(예: 89.5 → 89.5점은 B학점)
score = float(user_input)
# 반올림 여부는 정책에 맞게 결정
# 예: 정수화하려면 round(score) 또는 int(score) 사용
4. 예외 범위 좁히기
일반 except Exception은 너무 넓어 예기치 못한 상황을 숨길 수 있습니다. 최소한 필요한 예외만 처리하거나, 로깅을 추가하세요.
5. 학점 계산을 함수로 분리(테스트 용이)
def grade_of(score: int) -> str:
if score >= 90: return 'A'
elif 80 <= score < 90: return 'B'
elif 70 <= score < 80: return 'C'
elif 60 <= score < 70: return 'D'
else: return 'F'
6) 주석 버전(이해용)
while True: # 무한 반복 시작
try:
user_input = input('점수 입력(종료:q): ') # 문자열 입력
# 종료 조건: 대소문자 구분 없이 'q'
if user_input.lower() == 'q':
print("프로그램을 종료합니다")
break # while 탈출
# 문자열 → 정수 변환 (실패 시 ValueError)
score = int(user_input)
# 점수 구간에 따른 학점 판정
if score >= 90:
grade = 'A'
elif 80 <= score < 90:
grade = 'B'
elif 70 <= score < 80:
grade = 'C'
elif 60 <= score < 70:
grade = 'D'
else:
grade = 'F'
# 결과 출력 (f-string 사용)
print(f'{score}점은 {grade}학점 입니다.')
except ValueError:
# 정수가 아닌 입력에 대한 안내
print("잘못된 입력입니다. 점수 또는 'q'를 입력해주세요.")
except Exception as e:
# 그 밖의 예외 처리(디버깅에 도움)
print(f'오류가 발생했습니다. {e}')
추가 질문)
except Exception as e:에서 e는 사용자가 임의로 정해도 되는건가요?
첫번째 답변)
네, e는 개발자가 임의로 정하는 변수 이름입니다.
except Exception as e:에서
- Exception은 예외 클래스입니다.
- as e는 발생한 예외 인스턴스를 e라는 이름의 변수에 담겠다는 의미입니다.
즉, e 대신 error, err, ex, exception_obj 등 아무 이름이나 쓸 수 있습니다.
예시:
except Exception as error:
print(f'오류가 발생했습니다. {error}')
위 코드는 except Exception as e:와 완전히 동일하게 동작합니다.
하지만 보통 파이썬 관례(PEP 8)에서는 간단히 e나 err를 자주 씁니다.
✅ 추가로:
- as 뒤의 이름은 현재 except 블록 안에서만 유효합니다.
- as를 안 쓰면 예외 객체를 받을 수 없으므로, 예외 내용을 출력하려면 반드시 사용해야 합니다.
필요하면 except Exception: 형태로 그냥 잡고 메시지는 고정 텍스트로만 출력할 수도 있지만, 디버깅하기 불편해지므로 예외 객체를 담는 게 좋습니다.
두번째 답변)
except Exception as e:에서 e는 개발자가 임의로 정한 변수 이름입니다.
except 구문의 역할
try...except 구문에서 except는 오류(예외)가 발생했을 때 그 오류를 처리하는 역할을 합니다. 이때, except Exception as e: 구문은 다음과 같은 의미를 가집니다.
- Exception: 파이썬에서 발생하는 모든 일반적인 예외를 포괄하는 최상위 클래스입니다. 즉, 어떤 종류의 오류든 이 블록에서 처리할 수 있습니다.
- as e: 발생한 **오류 객체(Exception object)**를 e라는 변수에 할당하라는 의미입니다. 이렇게 하면 개발자는 e 변수를 통해 오류에 대한 구체적인 정보(예: 오류 메시지)를 가져와서 출력하거나 로깅할 수 있습니다.
변수 이름의 자유도
e 대신 err, error, exception_info 등 원하는 어떤 변수 이름이든 사용할 수 있습니다. 예를 들어, 아래 두 코드는 동일하게 작동합니다.
try:
# ... 코드
except Exception as error_message:
print(f"오류가 발생했습니다: {error_message}")
따라서, e는 관례적으로 많이 사용되는 이름이지만, 파이썬 문법상 필수적인 이름은 아니며 개발자가 자유롭게 정할 수 있습니다. 이 변수를 통해 오류의 원인을 더 명확하게 파악하고 사용자에게 친절한 메시지를 제공하는 것이 일반적인 예외 처리 방법입니다.
네, 가능합니다. except Exception as e: 구문에서 e는 발생한 예외 객체를 가리키는 변수 이름입니다. 이 변수 이름은 개발자가 원하는 대로 자유롭게 정할 수 있습니다.
따라서 e 대신 kim, abc, error_info 등 어떤 유효한 변수 이름이든 사용할 수 있으며, 프로그램은 정상적으로 작동합니다. 관례상 e나 err처럼 짧고 직관적인 이름을 사용하는 경우가 많지만, 코드의 가독성을 높이기 위해 error_message와 같이 더 구체적인 이름을 사용하기도 합니다.
이름이 달라져도 기능은 동일합니다. as 키워드는 발생한 예외 객체를 해당 변수에 할당하는 역할을 하며, 이 변수를 통해 오류의 종류나 메시지 같은 세부 정보를 얻을 수 있습니다.
========> 실행파일로 만드는 방법
https://soccom.tistory.com/896에 적어두었으니 따라하면 됨
'파이썬(Python)' 카테고리의 다른 글
| 파이썬, while문을 이용한 반복 출력 소스 (2) (0) | 2025.08.29 |
|---|---|
| 파이썬, while문을 이용한 반복 출력 소스 (1) (0) | 2025.08.29 |
| 파이썬 실행파일 IDE Shell로 연습한 소스를 실행파일로 만드는 방법 정리(1 of 2) (1) | 2025.08.27 |
| 파이썬, 항공권 할인율을 조회하여 출력하는 소스 (2) | 2025.08.26 |
| 파이썬, 연도와 월을 입력받아 해당 연도 월의 일수를 출력하는 프로그램 (1) | 2025.08.26 |
콘텐츠 내 자동삽입광고
