첫번째 실습 파일을 이용해서 고객정보 관리 시스템을 module화 하여 메인을 간소화 하였다.
1. 함수 만들기 (do_I, do_P, do_C, do_N, do_U, do_D)
2. 각 함수에 해당하는 module 생성 ( cust 디렉토리 안에 각 폴더 생성 후 module 파일 만들기 )
3. main에 각 module을 import하기
4. main 간소화 하기
5. do_I와 do_U도 module화하여 간소화하기
: 사용자로부터 데이터를 입력 받고 입력 받는 데이터를 검토 한다.(chk_input_data 함수)
6. global 변수를 main 안에 넣고 각 module의 변수 연결하기
customers = list()
index = -1
1. 함수 만들기 (do_I, do_P, do_C, do_N, do_U, do_D)
5. do_I와 do_U도 module화하여 간소화하기
: 사용자로부터 데이터를 입력 받고 입력 받는 데이터를 검토 한다.(chk_input_data 함수)
def chk_input_data(msg, func):
while True:
x = input(msg).upper()
if func(x):
break
else:
print('잘못 입력하셨습니다. 다시 입력 해 주세요.')
return x
def print_menu():
return input('''
다음 중에서 하실 작업의 메뉴를 입력하세요.
I - 고객 정보 입력
P - 이전 고객 정보 조회
C - 현재 고객 정보 조회
N - 다음 고객 정보 조회
U - 현재 고객 정보 수정
D - 현재 고객 정보 삭제
Q - 프로그램 종료
''').upper()
def do_I():
global customers, index
print('고객정보 입력')
customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }
#이름 입력 3글자 이상 체크(람다식)
customer['name'] = chk_input_data('이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False)
#성별 M, F 입력
customer['gender'] = chk_input_data('성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M', 'F') else False)
#이메일 입력
customer['email'] = chk_input_data('이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False)
#출생연도 입력
customer['year'] = chk_input_data('출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)
print(customer)
customers.append(customer)
print(customers)
index = len(customers) - 1
def do_P():
global customers, index
print('이전 고객 정보 조회')
if index < 0:
print('이전 데이타로 이동 불가.')
print(index)
else:
index -= 1
print(f'{index + 1}번째 고객 정보 입니다.')
print(customers[index])
def do_C():
global customers, index
print('현재 고객 정보 조회')
if index >= 0:
print(f'{index + 1}번째 고객 정보 입니다.')
print(customers[index])
else:
print('입력된 정보가 없습니다. 정보 입력은 I를 선택하세요.')
def do_N():
global customers, index
print('다음 고객 정보 조회')
if index >= (len(customers) - 1):
print('이후 데이터 이동 불가')
print(index)
else:
index += 1
print(f'{index + 1}번째 고객 정보 입니다.')
print(customers[index])
def do_U():
global customers, index
print('현재 고객 정보 수정')
customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }
customer['name'] = input('이름을 입력하세요 : ')
while True:
customer['gender'] = input('성별 (M/F)를 입력하세요 : ').upper()
if customer['gender'] in ('M', 'F'):
break
else:
print('잘못입력하셨습니다. 다시 입력 해 주세요.')
while True:
customer['email'] = input('이메일 주소를 입력하세요 : ')
golbang = '@' in customer['email']
if golbang:
break
else:
print('"@"를 포함한 이메일 주소를 입력하세요.')
while True:
customer['year'] = input('출생년도 4자리 입력하세요 : ')
check = len(customer['year']) == 4 and customer['year'].isdigit()
if check:
break
else:
print('잘 입력 해라....')
print(customer)
customers[index] = customer
def do_D():
global customers, index
print(f'현재 고객 정보{customers[index]["name"]} 삭제')
del customers[index]
2. 각 함수에 해당하는 module 생성 ( cust 디렉토리 안에 각 폴더 생성 후 module 파일 만들기 )
- common.py (cust.ver1폴더에 생성)
def print_menu():
return input('''
다음 중에서 하실 작업의 메뉴를 입력하세요.
I - 고객 정보 입력
P - 이전 고객 정보 조회
C - 현재 고객 정보 조회
N - 다음 고객 정보 조회
U - 현재 고객 정보 수정
D - 현재 고객 정보 삭제
S - 고객 정보 저장
Q - 프로그램 종료
''').upper()
def chk_input_data(msg, func, upper=True):
while True:
x = input(msg)
if upper:
x = x.upper()
if func(x):
break
else:
print('잘못 입력하셨습니다. 다시 입력 해 주세요.')
return x
※ 계속 반복적으로 나오는 print_menu와 짜투리 함수는 common.py에 넣어 메인을 간소화 시켰다.
- do_I.py (cust.insert폴더에 생성)
from cust.ver1.common import chk_input_data as check
def do_I(customers, index):
#customers는 주소값이 넘어오는것(여기서 수정되면 main에서 변경됨), index는 값이 넘어오는것(여기서 수정되도 main에 변경안됌 따라서 return필요)
print('고객정보 입력')
customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }
#이름 입력 3글자 이상 체크(람다식)
customer['name'] = check('이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False, upper=True)
#성별 M, F 입력
customer['gender'] = check('성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M', 'F') else False)
#이메일 입력
customer['email'] = check('이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False, upper=False)
#출생연도 입력
customer['year'] = check('출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)
customers.append(customer)
index = len(customers) - 1
return index
※ do_I는 고객 정보 입력 모듈이므로 'from cust.ver1.common import chk_input_data as check' 으로 import 해주었다.
- do_P.py (cust.read폴더에 생성)
def do_P(customers, index):
print('이전 고객 정보 조회')
if index <= 0:
print('이전 데이터로 이동 불가.')
print(index)
else:
index -= 1
print(f'{index}번째 고객 정보 입니다.')
print(customers[index])
return index
- do_C.py (cust.read폴더에 생성)
def do_C(customers, index):
print('현재 고객 정보 조회')
print('>>>>>', index)
if index >= -1:
print(f'{index}번째 고객 정보 입니다.')
print(customers[index])
else:
print('입력된 정보가 없습니다. 정보 입력은 I를 선택하세요.')
- do_N.py (cust.read폴더에 생성)
def do_N(customers, index):
print('다음 고객 정보 조회')
if index >= (len(customers) - 1):
print('이후 데이터 이동 불가')
print(index)
else:
index += 1
print(f'{index}번째 고객 정보 입니다.')
print(customers[index])
return index
- do_U.py (cust.update폴더에 생성)
from cust.ver1.common import chk_input_data
def do_U(customers, index):
print('현재 고객 정보 수정')
customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }
# 수정 내용이 없는 항목은 이전 값 유지 하도록.
#이름 입력 3글자 이상 체크(람다식)
customer['name'] = chk_input_data('수정할 이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False)
#성별 M, F 입력
customer['gender'] = chk_input_data('수정할 성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M', 'F') else False)
#이메일 입력
customer['email'] = chk_input_data('수정할 이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False)
#출생연도 입력
customer['year'] = chk_input_data('수정할 출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)
print(customer)
customers[index] = customer
※ do_U도 고객 정보를 입력받는 모듈이므로 'from cust.ver1.common import chk_input_data' 으로 import 해주었다.
- do_D.py (cust.delete폴더에 생성)
def do_D(customers, index):
if not customers:
print("고객 정보가 없습니다.")
else:
print(f'현재 고객 정보 {customers[index]["name"]} 삭제')
print('index : ',index)
del customers[index]
if index >= len(customers):
index = len(customers) - 1 # 마지막 고객 정보를 가리키도록 설정
return index
※ 고객 정보가 없을 때 D를 누르면 error가 생겨서 조건문을 넣어 주었다.※ 고객 정보가 삭제되었을 때 index 정보도 같이 변화되도록 설정 했다.
3. main에 각 module을 import하기
4. main 간소화 하기
from cust.ver1.common import print_menu
from cust.insert.do_I import do_I as I
from cust.read.do_C import do_C as C
from cust.read.do_P import do_P as P
from cust.read.do_N import do_N as N
from cust.update.do_U import do_U as U
from cust.delete.do_D import do_D as D
#START
def main():
customers = list()
index = -1
while True:
menu = print_menu()
if menu == 'I':
index = I(customers, index)
elif menu == 'P':
index = P(customers, index)
elif menu == 'C':
C(customers, index)
elif menu == 'N':
index = N(customers, index)
elif menu == 'U':
U(customers, index)
elif menu == 'D':
index = D(customers, index)
elif menu == 'Q':
print('안녕히가세요~')
break
else:
print('잘못 입력하셨습니다. 다시 입력 해주세요')
if __name__ == '__main__':
main()
※ from으로 import하여 각 함수만 main으로 불러왔다.
※ 각 메뉴들은 alias 로 정해준 별명을 main에 입력해주었다.
※ 앞에 index = OOO 써진 함수들은 각 모듈에서 index 값이 변화되면 그 값을 return해주고,
main에서 return된 index 값을 가져오기 위해서 써주었다.
6. global 변수를 main 안에 넣고 각 module의 변수 연결하기
customers = list()
index = -1
- main()
def main():
customers = list()
index = -1
while True:
menu = print_menu()
if menu == 'I':
index = I(customers, index)
elif menu == 'P':
index = P(customers, index)
elif menu == 'C':
C(customers, index)
elif menu == 'N':
index = N(customers, index)
elif menu == 'U':
U(customers, index)
elif menu == 'D':
index = D(customers, index)
elif menu == 'S':
S(customers)
맨 위에 써진 global변수들을 main() 안에 넣어 준다.
각 module에 customers와 index값을 넘기기 위해 I(customers, index) 이런식으로 코드를 써주었다.
- do_I 모듈
def do_I(customers, index):
print('고객정보 입력')
customer = { 'name':'', 'gender': '', 'email': '', 'year': 0 }
customer['name'] = check('이름을 입력하세요 : ', lambda x: True if len(x) > 2 else False, upper=True)
customer['gender'] = check('성별 (M/F)를 입력하세요 : ', lambda x: True if x in ('M', 'F') else False)
customer['email'] = check('이메일 주소를 입력하세요 : ', lambda x: True if '@' in x else False, upper=False)
customer['year'] = check('출생년도 4자리 입력하세요 : ', lambda x: True if len(x) == 4 and x.isdigit() else False)
customers.append(customer)
index = len(customers) - 1
return index
※do_I(customers, index)
: customers는 참조변수, 주소값이 넘어옴 (여기서 수정되면 main에서도 변경이 적용됨)
index는 값변수, 값이 넘어옴(여기서 수정되도 main에 변경안됨 따라서 return 필요)
※ 여기서 변경된 index값이 main에서도 적용되야 하므로 return index 해줌
'Back-End > Python' 카테고리의 다른 글
[Python][파이썬] 고객 정보 관리 시스템 만들기 실습 4 - 고객정보 파일저장, pickle라이브러리 (2) | 2023.11.10 |
---|---|
[Python][파이썬]객체 지향 프로그래밍(OOP) (0) | 2023.11.10 |
[Python][파이썬] 고객 정보 관리 시스템 만들기 실습 2 (3) | 2023.11.08 |
[Python][파이썬] 라이브러리 활용 - datetime, timedelta, relativedelta (0) | 2023.11.08 |
[Python][파이썬] 라이브러리, 모듈(module), import , __name__ (1) | 2023.11.08 |