콘솔 입출력(추가)
# 이스케이프 캐릭터(탈출문자) print('Hello\n\tWorld') print('Hello\n\'World\'') #\' : '출력 print('Hello \\ World') #\\ : \출력 # % 포맷코드로 출력 str1='me' i=99 print('%s는 %d'%(str1,i)) print(f'{str1}는 {i}') print('{0}는 {1}'.format(str1,i)) #f' 함수 소숫점 제한 print(f'{99.1234:.2f}') -----------------출력--------------------- -----------------출력--------------------- Hello World Hello 'World' Hello \ World me는 99 me는 99 me는 99 99.12
--> f' / .format 숙달
f'{99.1234:.2f} 중괄호 안 2.2f - 전체자리수.소수점f
상속(Inheritance)
# Car 부모클래스 class Car: #Mother Class __name='car' __color='white' __plate_number='' __product_year=1900 def __str__(self) -> str: return '부모 클래스' def run(self): return 'Car is running' def stop(self): return 'Car is Stopped' def get_name(self): return self.__name -----------------구분(Car 부모클래스)--------------------- from code38_car import * class Genesis(Car): def __init__(self,name,color,plate_number,product_year) -> None: super().__init__ self.__name=name self.__color=color self.__plate_number=plate_number self.__product_year=product_year print(f'{self.__name} 인스턴스 생성') def set_name(self,name): self.__name=name def get_name(self): return self.__name def run(self): #부모클래스 run 함수 재정의 return f'{self.__name}이(가) 달립니다.' def stop(self): return f'{self.__name}이(가) 멈춥니다.' gv80=Genesis('GV80','BLACK','15더 8117',2010) gv80.set_name('GV80') print(f'이 차의 이름은{gv80.get_name()}입니다.') print(gv80.run()) print(gv80.stop()) print(gv80.__color) # 이 구문이 오류가 나는 이유는 변수 선언을 __ 을 통해서 접근을 못하게 막아놨기때문에 # print(gv80.__color)로 바로 변수를 출력하는것 자체도 불가능하고 # color을 출력하고싶으면 set_name/get_name 처럼 set_color/get_color을 통해서 # 함수로 접근해야 출력할 수 있음. -----------------출력--------------------- -----------------출력--------------------- GV80 인스턴스 생성 이 차의 이름은GV80입니다. GV80이(가) 달립니다. GV80이(가) 멈춥니다.
- print(gv80.__color) 을 통해서 color 변수를 출력하려고 했지만 변수선언 자체를
- __변수 로 선언했기에 외부에서 접근이 아예 불가능하고
- color을 출력하고 싶다면 set_name/get_name처럼 set_color/get_color로 함수로 접근해서 출력시켜야 출력됨.
--> 바로 출력시키려다가 접근자체를 못한다고 오류났었음
import os def clearConsole(): #콘솔 클리어 os.system('cls') # 2. Class 생성 class Contact: def __init__(self,name,phone_num,email,addr) -> None: #생성자 - 이름 / 전화번호 / 이메일 / 주소 self.__name=name self.__phone_num=phone_num self.__email=email self.__addr=addr def __str__(self) -> str: #___str 함수 재정의 - print 찍을 때 기본꼴 str_return=(f'이름 :{self.__name}\n휴대폰:{self.__phone_num}\n이메일:{self.__email}\n주소:{self.__addr}') return str_return # 연락처 삭제 시 이름 찾기 def isNameExist(self,name): if self.__name==name: return True else: return False # 5. 사용자 입력 def set_contact(): name,phone_num,email,addr=input('정보입력(이름/전화번호/이메일/주소[구분자:/]: ').split('/') contact = Contact(name,phone_num,email,addr) return contact #사용자가 입력한 정보가 들어간 Contact Class를 반환 # 연락처 출력 def get_contact(lst_contact): for i in lst_contact: #저장된 연락처 모두 출력 print(i) print('============') # 6. 메뉴 입력 def get_menu(): str_menu=('주소록 프로그램\n1.연락처 추가\n2.연락처 출력\n3.연락처 삭제\n4.종료\n') print(str_menu) menu=input('메뉴입력>') return int(menu) #연락처 삭제 def del_contact(lst_contact,name): count=0 for i,item in enumerate(lst_contact): #For 돌리면서 index값도 같이 부여하고싶을때 enumerate 사용 #i에는 0,1,2,3... 들어가고 item에는 입력한 연락처 자체가 들어감 if item.isNameExist(name): #삭제하고자 하는 name이 존재한다면 count+=1 del lst_contact[i] #해당 위치(i)에 있는 배열을 삭제한다 if count >0: print('삭제했습니다') else: print('삭제할 연락처가 없습니다') # 디버그 시 수행 def run(): # temp=Contact('오윤범','010-8515-0728','dbsqja353@naver.com','부산광역시 중구') # print(temp) --> __str__ 함수에서 선언한대로 출력됨 lst_contact=[] # 사용자 입력을 받을 연락처 list clearConsole() while True: sel_menu=get_menu() # 메뉴 입력 if sel_menu==1: # 연락처 추가 clearConsole() contact = set_contact() lst_contact.append(contact)# 만들어둔 lst_contact에 새로운 연락처 리스트들을 계속 추가 input('주소록 입력 성공') clearConsole() elif sel_menu==2: # 연락처 출력 clearConsole() if not lst_contact: #list가 비어있다면/입력된 연락처가 없을 때 print('연락처가 없습니다') input() clearConsole() else: print('저장된 연락처>>') get_contact(lst_contact) # 추가된 연락처들이 들어있는 lst_contact를 출력 input('주소록 출력 성공') clearConsole() # 연락처 삭제 elif sel_menu==3: clearConsole() name=input('삭제할 이름 입력>') del_contact(lst_contact,name) input() clearConsole() # 종료 elif sel_menu==4: break # 1. Main 영역 if __name__=='__main__': run()#디버그 시 수행 -----------------출력--------------------- -----------------출력--------------------- 주소록 프로그램 1.연락처 추가 2.연락처 출력 3.연락처 삭제 4.종료 메뉴입력>1 -----------------구분--------------------- 정보입력(이름/전화번호/이메일/주소[구분자:/]: 오윤범/010-8515-0728/dbsqja353@naver.com/부산광역시 -----------------구분--------------------- 주소록 프로그램 1.연락처 추가 2.연락처 출력 3.연락처 삭제 4.종료 메뉴입력>2 -----------------구분--------------------- 저장된 연락처>> 이름 :오윤범 휴대폰:010-8515-0728 이메일:dbsqja353@naver.com 주소:부산광역시 ============ -----------------구분--------------------- 삭제할 이름 입력>오윤범 -----------------구분--------------------- 주소록 프로그램 1.연락처 추가 2.연락처 출력 3.연락처 삭제 4.종료 메뉴입력>2 -----------------구분--------------------- 연락처가 없습니다
- 간단한 주소록 프로그램
연락처 추가/출력/삭제 및 종료 네가지 기능을 가지는 주소록 프로그램
-> ClearConsole 처음 사용
-> input() 과 ClearConsole()을 같이 사용해서 깔끔한 콘솔 창 만들기 가능
-> del_contact 함수에서 enumerate 함수 처음 사용
-> del_contact 함수에 count 값을 통해 찾는 이름이 없을 때 오류 처리
enumerate 함수
-> for문과 함께 사용되고 해당 Data나 list 따위에 인덱스를 임의로 부여하는 함수라고 보면 됨
--> for i,item in enumerate(lst_contact)와 같이 사용시에 i는 임의의 인덱스값, item에는 lst_contact 리스트에 저장된 lst_contact[i] 의 자료들이 출력됨for i,item in enumerate(lst_contact): print(f'{i}\n{item}') -----------------출력--------------------- -----------------출력--------------------- 0 이름 :가 휴대폰:1 이메일:1 주소:1
-> 다음과 같이 i번째 / lst_contact[i] 가 같이 출력되는 것을 볼 수 있음
주소록 프로그램 + txt파일로 주소록 저장
import os def clearConsole(): #콘솔 클리어 os.system('cls') # 2. Class 생성 class Contact: def __init__(self,name,phone_num,email,addr) -> None: #생성자 - 이름 / 전화번호 / 이메일 / 주소 self.__name=name self.__phone_num=phone_num self.__email=email self.__addr=addr def __str__(self) -> str: #___str 함수 재정의 - print 찍을 때 기본꼴 str_return=(f'이름 :{self.__name}\n휴대폰:{self.__phone_num}\n이메일:{self.__email}\n주소:{self.__addr}') return str_return # 연락처 삭제 시 이름 찾기 def isNameExist(self,name): if self.__name==name: return True else: return False # 연락처 파일 DB 저장을 위한 멤버변수 접근 def getname(self): return self.__name def getphonenum(self): return self.__phone_num def getemail(self): return self.__email def getaddr(self): return self.__addr # 5. 사용자 입력 def set_contact(): name,phone_num,email,addr=input('정보입력(이름/전화번호/이메일/주소[구분자:/]: ').split('/') contact = Contact(name,phone_num,email,addr) return contact #사용자가 입력한 정보가 들어간 Contact Class를 반환 # 파일 저장 def save_contact(lst_contact): f=open('C:/Source/Python2023/Project/contact.txt','w',encoding='utf-8') for item in lst_contact: text=f'{item.getname()}/{item.getphonenum()}/{item.getemail()}/{item.getaddr()}' f.write(f'{text}\n') f.close() #파일 닫기 #파일 불러오기 def load_contact(lst_contact): f=open('C:/Source/Python2023/Project/contact.txt','r',encoding='utf-8') while True: line=f.readline().replace('\n','')#문장끝 줄바꿈을 없애줘야 정상적으로 저장하고 불러올 수 있음 # replace 처리를 안해주게되면 아래에서 lines[0]... 불러올 때 인덱스 오류 생김 if not line:break lines=line.split('/') contact=Contact(lines[0],lines[1],lines[2],lines[3]) lst_contact.append(contact) f.close() # 연락처 출력 def get_contact(lst_contact): for item in lst_contact: #저장된 연락처 모두 출력 print(item) print('============') # 6. 메뉴 입력 def get_menu(): str_menu=('주소록 프로그램\n1.연락처 추가\n2.연락처 출력\n3.연락처 삭제\n4.종료\n') print(str_menu) menu=input('메뉴입력>') return int(menu) #연락처 삭제 def del_contact(lst_contact,name): count=0 for i,item in enumerate(lst_contact): #For 돌리면서 index값도 같이 부여하고싶을때 enumerate 사용 #i에는 0,1,2,3... 들어가고 item에는 입력한 연락처 자체가 들어감 if item.isNameExist(name): #삭제하고자 하는 name이 존재한다면 count+=1 del lst_contact[i] #해당 위치(i)에 있는 배열을 삭제한다 if count >0: print('삭제했습니다') else: print('삭제할 연락처가 없습니다') # 디버그 시 수행 def run(): # temp=Contact('오윤범','010-8515-0728','dbsqja353@naver.com','부산광역시 중구') # print(temp) --> __str__ 함수에서 선언한대로 출력됨 lst_contact=[] # 사용자 입력을 받을 연락처 list load_contact(lst_contact) clearConsole() while True: sel_menu=get_menu() # 메뉴 입력 if sel_menu==1: # 연락처 추가 clearConsole() contact = set_contact() lst_contact.append(contact)# 만들어둔 lst_contact에 새로운 연락처 리스트들을 계속 추가 input('주소록 입력 성공') clearConsole() elif sel_menu==2: # 연락처 출력 clearConsole() if not lst_contact: #list가 비어있다면/입력된 연락처가 없을 때 print('연락처가 없습니다') input() clearConsole() else: print('저장된 연락처>>') get_contact(lst_contact) # 추가된 연락처들이 들어있는 lst_contact를 출력 input('주소록 출력 성공') clearConsole() # 연락처 삭제 elif sel_menu==3: clearConsole() name=input('삭제할 이름 입력>') del_contact(lst_contact,name) input() clearConsole() # 종료 elif sel_menu==4: save_contact(lst_contact) #입력한 주소록 파일로 저장 break else: clearConsole() # 1. Main 영역 if __name__=='__main__': run()#디버그 시 수행
- 주소록 파일 저장하기 / 불러오기
#파일 저장하기 def save_contact(lst_contact): f=open('C:/Source/Python2023/Project/contact.txt','w',encoding='utf-8') for item in lst_contact: text=f'{item.getname()}/{item.getphonenum()}/{item.getemail()}/{item.getaddr()}' f.write(f'{text}\n') f.close() #파일 닫기 -----------------구분--------------------- #파일 불러오기 def load_contact(lst_contact): f=open('C:/Source/Python2023/Project/contact.txt','r',encoding='utf-8') while True: line=f.readline().replace('\n','')#문장끝 줄바꿈을 없애줘야 정상적으로 저장하고 불러올 수 있음 # replace 처리를 안해주게되면 아래에서 lines[0]... 불러올 때 인덱스 오류 생김 if not line:break lines=line.split('/') contact=Contact(lines[0],lines[1],lines[2],lines[3]) lst_contact.append(contact) f.close()
--> save_contact / load_contact 함수를 통해 사용자가 입력한 주소록을 저장 / 불러오기
--> save_contact 함수는 종료문 break 바로 앞줄 / load_contact는 run() 함수 시작할 때 같이
--> line=f.readline().replace('\n','') 으로 줄바꿈을 없애줘야 txt파일로 줄바꿈 없이 정상적으로 들어가고 정상적으로 불러올 수 있음
주소록 프로그램 + 예외처리(최종)
# 주소록 프로그램 # 2023-02-06 # OYB # 예외처리 # 1. 파일 없을 때 - load_contact에서 잡음 # 2. 입력 시 /갯수 다를때 - run() 함수 내에 sel_menu==1 부분에서 수정 # 3. 메뉴에 숫자 외 문자 입력- get_menu에서 잡음 import os def clearConsole(): #콘솔 클리어 os.system('cls') # 2. Class 생성 class Contact: def __init__(self,name,phone_num,email,addr) -> None: #생성자 - 이름 / 전화번호 / 이메일 / 주소 self.__name=name self.__phone_num=phone_num self.__email=email self.__addr=addr def __str__(self) -> str: #___str 함수 재정의 - print 찍을 때 기본꼴 str_return=(f'이름 :{self.__name}\n휴대폰:{self.__phone_num}\n이메일:{self.__email}\n주소:{self.__addr}') return str_return # 연락처 삭제 시 이름 찾기 def isNameExist(self,name): if self.__name==name: return True else: return False # 연락처 파일 DB 저장을 위한 멤버변수 접근 def getname(self): return self.__name def getphonenum(self): return self.__phone_num def getemail(self): return self.__email def getaddr(self): return self.__addr # 5. 사용자 입력 def set_contact(): name,phone_num,email,addr=input('정보입력(이름/전화번호/이메일/주소[구분자:/]: ').split('/') contact = Contact(name,phone_num,email,addr) return contact #사용자가 입력한 정보가 들어간 Contact Class를 반환 # 파일 저장 def save_contact(lst_contact): f=open('C:/Source/Python2023/Project/contact.txt','w',encoding='utf-8') for item in lst_contact: text=f'{item.getname()}/{item.getphonenum()}/{item.getemail()}/{item.getaddr()}' f.write(f'{text}\n') f.close() #파일 닫기 #파일 불러오기 def load_contact(lst_contact): try: # file 없을 때 불러오면 예외처리 f=open('C:/Source/Python2023/Project/contact.txt','r',encoding='utf-8') except Exception as e: #txt파일이 없다면 비어있는 txt하나 생성하고 탈출 file=open('C:/Source/Python2023/Project/contact.txt','w',encoding='utf-8') file.close() return while True: line=f.readline().replace('\n','')#문장끝 줄바꿈을 없애줘야 정상적으로 저장하고 불러올 수 있음 # replace 처리를 안해주게되면 아래에서 lines[0]... 불러올 때 인덱스 오류 생김 if not line:break lines=line.split('/') contact=Contact(lines[0],lines[1],lines[2],lines[3]) lst_contact.append(contact) f.close() # 연락처 출력 def get_contact(lst_contact): for item in lst_contact: #저장된 연락처 모두 출력 print(item) print('============') # 6. 메뉴 입력 + 메뉴에 숫자 대신 문자 입력 시 예외 처리 def get_menu(): str_menu=('주소록 프로그램\n1.연락처 추가\n2.연락처 출력\n3.연락처 삭제\n4.종료\n') print(str_menu) try: menu=int(input('메뉴입력>')) except Exception as e: # 숫자 외 입력 예외처리 menu =0 #문자 넣으면 전부 0으로 처리 return menu #연락처 삭제 def del_contact(lst_contact,name): count=0 for i,item in enumerate(lst_contact): #For 돌리면서 index값도 같이 부여하고싶을때 enumerate 사용 #i에는 0,1,2,3... 들어가고 item에는 입력한 연락처 자체가 들어감 if item.isNameExist(name): #삭제하고자 하는 name이 존재한다면 count+=1 del lst_contact[i] #해당 위치(i)에 있는 배열을 삭제한다 if count >0: print('삭제했습니다') else: print('삭제할 연락처가 없습니다') # 디버그 시 수행 def run(): # temp=Contact('오윤범','010-8515-0728','dbsqja353@naver.com','부산광역시 중구') # print(temp) --> __str__ 함수에서 선언한대로 출력됨 lst_contact=[] # 사용자 입력을 받을 연락처 list load_contact(lst_contact) clearConsole() while True: sel_menu=get_menu() # 메뉴 입력 if sel_menu==1: # 연락처 추가 clearConsole() try: contact = set_contact() lst_contact.append(contact)# 만들어둔 lst_contact에 새로운 연락처 리스트들을 계속 추가 input('주소록 입력 성공') except Exception as e: print('!!이름/전화번호/이메일/주소 형태로 입력!!',end='') input() finally: #try/except/finally의 로직 - try로 set_contact호출해서 주소록에 자료 입력했는데 #나뉘는 단위인 '/'를 4개 안찍고 하나만 찍어서 오류를 발생시키면 # except 으로 들어가서 오류문을 찍는거고 input()으로 사용자 입력을 기다리고 있다가 # 사용자가 키보드 입력을 하게되면 finally 로 넘어가게 되고 # finally에서 clearsoncole()을 통해 콘솔 화면을 초기화 시키고 나면 # 다시 무한루프 돌고있는 while문의 가장 위로 올라가서 get_menu()를 실행시키기에 # 메뉴 입력받는 화면이 계속 나타남 clearConsole() elif sel_menu==2: # 연락처 출력 clearConsole() if not lst_contact: #list가 비어있다면/입력된 연락처가 없을 때 print('연락처가 없습니다') input() clearConsole() else: print('저장된 연락처>>') get_contact(lst_contact) # 추가된 연락처들이 들어있는 lst_contact를 출력 input('주소록 출력 성공') clearConsole() # 연락처 삭제 elif sel_menu==3: clearConsole() name=input('삭제할 이름 입력>') del_contact(lst_contact,name) input() clearConsole() # 종료 elif sel_menu==4: save_contact(lst_contact) #입력한 주소록 파일로 저장 break else: clearConsole() # 1. Main 영역 if __name__=='__main__': run()#디버그 시 수행
주피터 노트북
파일 생성 시 - 파일(메뉴바) - 새파일 - 주피터 클릭 - 원하는 폴더에 확장자명.ipynb로 파일 생성 - markdown / Python 파일에 내용 작성 후 Ctrl+enter - 경고 팝업 나오면 확인 이후 venv 설치- 주피터 노트북 사용 시 디버그 창 없이 가독성 좋게 바로바로 실행 가능
- 새로운 코딩 창 생성하고 싶으면 b 입력 + Enter 로 다른 셀에 코딩 가능