지난 글을 이어가보면, 오늘의 포스팅은 아래의 코드를 작성하는 것이다.
4. 모듈화 예시
- 덧셈과 뺄셈을 수행하는 계산기 코드를 작성할 예정인데,
사용자에게서 입력받는 값이 숫자인지를 판별하여 실행할 예정이다.
- 기능별 분류를 위해,
① 실행 코드(main_calc.py)
② 숫자 판별 코드(validate_input.py)
③ 덧셈 코드(add_calc.py)
④ 뺄셈 코드(sub_calc.py)
순서상으로는 세부 기능들이 있어야 동작할 수 있으니,
③ > ④ > ① > ② 의 순서로 코드를 작성하겠습니다.
1) 덧셈코드(add_calc.py) 작성
- 간단히 2개의 숫자를 파라미터로 전달 받아 결과 값을 return 해주는 함수를 생성한다.
- if __name__ == '__main__' : 조건을 통해 해당 모듈을 직접 실행할 때 예시문이 정상 동작하는 지 확인한다.
( if __name__ == '__main__' : 이 어떤 의미인지 아직 모르시나요?)
2023.11.27 - [Python/Tip & Etc] - [python] if __name__ == '__main__'
[python] if __name__ == '__main__'
다른 사람들의 코드를 참고하거나 강의를 보다보면 생각보다 자주 눈에 띄는 코드가 있다. 바로 if __name__ == '__main__' : 과 같은 조건문인데, 내가 하나의 파이썬 파일에서 코드를 작성할 때는 필
to-all-rounder.tistory.com
# 덧셈 모듈
def add_f(a, b):
print(f'{a} + {b}를 계산합니다.')
return a + b
if __name__ == '__main__':
result = add_f(3, 5)
print(f'결과 값은 {result} 입니다.')
2) 뺄셈코드(sub_calc.py) 작성
- 덧셈 코드와 동일한 구성을 가지고, 직접 실행 시 예문 결과를 실행한다.
# 뺄셈 모듈
def sub_f(a, b):
print(f'{a} - {b}를 계산합니다.')
return a - b
if __name__ == '__main__':
result = sub_f(3, 5)
print(f'결과 값은 {result} 입니다.')
3) 실행코드(main_calc.py) 작성
import add_calc
import sub_calc
while True :
a = input('첫번째 숫자를 입력하세요.')
oper_type = input('+ 또는 - 를 입력하세요.\n종료하려면 [exit]를 입력하세요.')
b = input('두번째 숫자를 입력하세요.')
if oper_type == '+':
result = add_calc.add_f(a, b)
print(result)
elif oper_type == '-':
result = sub_calc.sub_f(a, b)
print(result)
elif oper_type == 'exit':
print('계산기를 종료합니다.')
break
else:
print('잘못된 연산자 입니다.')
print('\n')
- input으로 입력 받는 값이 string 이라는 것만 기억하면, 어렵지 않게 작성할 수 있는 코드이다.
- 각 모듈별 결과가 정상적으로 출력되는 것을 볼 수 있다.
- 이제 해당 기능을 처리하기 전 유효성을 검사하는 코드를 추가해보겠다.
- 만약 a 또는 b의 변수에 숫자형의 자료가 아닌 값이 들어온다면 어떻게 해야할까?
- main_calc.py에서 예외문을 처리할 수도 있지만, validate_calc.py 를 통해 유효성 검사와 실제 코드 실행이라는 2가지 기능을 나누어 작성하면, 유효성과 관련된 수정이 필요할 때 validate_calc만 수정하면 된다.
4) 입력 값 유효성 검사 코드 (validate_input.py) 작성
- 먼저 해당 값이 int인지 분별하는 코드를 작성해보겠다.
- 현재 main_calc.py 에서는 int로 값을 받고 있기 때문에 문자가 입력되면 Erorr가 발생한다.
- main_calc.py 의 a와 b를 type 변환 없이 무조건 입력을 받고,
유효성 검사는 validate_input.py로 넘긴다.
def validate_input_value(a, b):
validate_a = False # 검증 전 a 유효성 상태 초기화
validate_b = False # 검증 전 b 유효성 상태 초기화
retry_count = 0
while (validate_a and validate_b) == False and retry_count < 5:
print(validate_a and validate_b)
try:
int(a)
validate_a = True
# print('valdate_a True')
except:
validate_a = False
# print('valdate_a False')
try:
int(b)
validate_b = True
# print('valdate_b True')
except:
validate_b = False
# print('valdate_b False')
if validate_a == False:
a = input('잘못된 숫자가 입력되었습니다.\n첫번째 숫자를 다시 입력하세요. : ')
if validate_b == False:
b = input('잘못된 숫자가 입력되었습니다.\n두번째 숫자를 다시 입력하세요. : ')
retry_count += 1
if retry_count == 5 and (validate_a and validate_b) == False:
print('반복된 숫자 오입력으로 프로그램을 종료합니다.')
a=0 # a 값 초기화
b=0 # b 값 초기화
return (validate_a and validate_b, int(a), int(b))
if __name__ == '__main__':
a = input('첫번째 숫자를 입력하세요. : ')
b = input('두번째 숫자를 입력하세요. : ')
validate_result = validate_input_value(a, b)
print(validate_result)
- 입력 받는 두 숫자가 int 로 type 변경을 시도할 때, 정상적으로 변경이 되면 validate_a 값을 Ture로 변환,
Error 가 발생하면 except 문을 통해 False로 유지하고 다시 재입력을 받는 if 문을 수행한다.
- 잘못된 입력이 5회 이상 반복되면 반복문을 종료하고,
해당 결과를 retrun 시, 첫번째 요소로 True, False로 구분하여 반환한다.
- 이제 해당 값을 기준으로 main_calc.py 에서 return 된 값이 Ture 일 때는 연산을 수행하고,
False 일 때는 연산을 수행하지 않도록 main_calc.py를 수정하면 완료된다.
- 현재는 a와 b 두개의 숫자만 파라미터로 유효성 검사를 하였지만,
oper_type 도 함께 파라미터로 처리하여 나누기 일 때 b 의 값이 0일 경우 등의 제한 사항을 유효성 검사에서 처리하는 방법으로 프로그램의 기능을 더 개선할 수도 있다.
5. main_calc.py 에서 결과 값 확인하기
# main_calc.py
import add_calc
import sub_calc
import validate_input
while True :
a = input('첫번째 숫자를 입력하세요. : ')
oper_type = input('+ 또는 - 를 입력하세요. : ')
b = input('두번째 숫자를 입력하세요. : ')
validated_result = validate_input.validate_input_value(a, b)
if validated_result[0] == True:
if oper_type == '+':
result = add_calc.add_f(validated_result[1], validated_result[2])
print(result)
elif oper_type == '-':
result = sub_calc.sub_f(validated_result[1], validated_result[2])
print(result)
else:
print('잘못된 연산자 입니다.')
if input('계속하시겠습니까?\n[exit] 입력 시, 종료 : ') == 'exit':
print('프로그램을 종료합니다.')
break
print('\n')
최종 파일
'IT 배우기 > 이것저것' 카테고리의 다른 글
크롬(Chrome Browser) 자동 업데이트 중지 (0) | 2023.12.14 |
---|---|
모듈화 1(modularity) (0) | 2023.11.28 |
애드센스 특정 광고 차단 하기2 (0) | 2023.11.23 |
애드센스 특정 광고 차단 하기1 (1) | 2023.11.19 |
크롬드라이버(ChromeDriver) 버전별 다운로드(download) (2) | 2023.11.07 |