23.02.06 Day06

오윤범·2023년 2월 6일
0

Python

콘솔 입출력(추가)

# 이스케이프 캐릭터(탈출문자)
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

Class

상속(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 로 다른 셀에 코딩 가능

0개의 댓글