4일(10.07) 파일입출력 과제풀이, 클래스
💻08_파일입출력
💾Ex05_허보람.py
아래와 같이 콘솔창에서 입력하고 출력할 수 있도록 한다.
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 1
단어 :sky
뜻:하늘
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 1
단어 :snow
뜻:눈
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 5
단어/뜻
cat/고양이
sky/하늘
snow/눈
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 2
검색할 단어 :sky
sky 의 뜻 : 하늘
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 2
검색할 단어 :desk
찾는 단어 없음
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 3
수정할 단어 입력 : dd
수정할 단어 없음
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 3
수정할 단어 입력 : sky
수정할 뜻 입력 : 땅
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 4
삭제할 단어 입력 : aa
삭제할 단어 없음
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 4
삭제할 단어 입력 : snow
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 5
단어/뜻
cat/고양이
sky/땅
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 7
1~6만 입력 가능
메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >> 6
프로그램 종료
#_*_coding:utf-8
'''
Created on 2022. 10. 6.
@author: admin
'''
#Ex05_허보람.py
#scanner input 사용입력, 입력한 값을 사전에 등록한다.(파일에 추가), 출력누르면 파일에 있는것 콘솔창에 보여주기, 수정을 누르면 수정되어서 파일에서 바뀐다. 삭제할 단어를 입력하면 파일에서 지워진다.
#swich-case문 사용?, dict, 'a'mode로 수정, remove로 삭제?
'''
내가 한것
d={}
while True:
print()
num = int(input('메뉴션택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >>'))
if num == 1 :
word = input('단어: ')
mean = input('뜻: ')
d[word]=mean
elif num == 2:
word =input('검색할 단어:')
if d.get(word) != None:
print(word ,'의 뜻 :', d.get(word))
else :
print('찾는 단어 없음')
elif num == 3:
word = input('수정할 단어: ')
if word in d :
mean = input('수정할 뜻: ')
d[word]=mean
else :
print('수정할 단어 없음')
elif num == 4:
word = input('삭제할 단어: ')
if word in d :
del d[word]
else :
print('삭제할 단어 없음')
elif num == 5:
if len(d) != 0:
print('단어 뜻:')
for i,j in d.items():
print(i,'', j)
else :
print('입력한 단어 없음')
elif num ==6:
print('종료')
break
else :
print('1~6까지 입력하세요.')
fw = open('dict.txt','a')
for i,j in d.items() :
fw.write(i+' '+j+'\n')
print(i+' '+j)
fw.close()
print('프로그램을 종료합니다.')
'''
#풀이
while True:
num = int(input('메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >>'))
if num == 1:
f = open('word.txt','a')
word = input('단어:')
mean = input('뜻:')
f.write(word+"/"+mean+"\n")
f.close()
elif num == 2:
flag = False
search_word = input('검색할 단어:')
f = open('word.txt','r')#읽기 위한 오픈
for line in f:
line_split = line.split('/') #'/'로 구분되어서 리스트형태로 나온다.
# print(line_split)
if line_split[0] == search_word :
print(search_word,'의 뜻:',line_split[1])
flag = True
#여기
if flag == False :
print('찾는 단어 없음')
f.close()
#한쌍(key,value)으로 처리할때는 사전으로 처리하는것이 편하다
elif num == 3: # 수정
list_word=[] #단어만 넣는다.['rose','cat','desk']
list_mean=[] #뜻만 넣는다.['장미'~]
f = open('word.txt','r') #먼저 전체 읽어온다.
for line in f :
line_split = line.split('/') #[rose, 장미 \n] 방 2개짜리 리스트가 생긴다.
list_word.append(line_split[0]) # ['rose','cat','desk']
list_mean.append(line_split[1].strip()) # ['장미'~] '/'로 분리시켜서 list_mean에 넣는다.
d = dict(zip(list_word,list_mean)) #zip이라는 함수로 묶어서 dict함수를 사용해서 사전으로 만든다.
print('d:',d)
#사전에서 수정할 단어를 찾는다.
update_word = input('수정할 단어 입력:')
if d.get(update_word) == None:
print('수정할 단어 없음')
continue #수정할 단어 없으면 밑에를 만나면 안되므로 continue 를 사용하여 멈추도록 한다.
update_mean = input('수정할 뜻 입력:')
d[update_word] = update_mean
f = open('word.txt','w')
for k in d : #key만 반복해서 들어간다.
f.write(k+'/'+d[k]+'\n')
f.close()
elif num == 4: # 삭제
list_word=[] # ['rose','cat','desk']
list_mean=[] # ['장미'~]
f = open('word.txt','r')
for line in f :
line_split = line.split('/')
list_word.append(line_split[0]) # ['rose','cat','desk'] # ['rose','cat','desk'] 단어를 분리하여 list_word에 넣는다.
list_mean.append(line_split[1].strip()) # ['장미'~] '/'로 분리시켜서 list_mean에 넣는다.
d = dict(zip(list_word,list_mean)) #{rose:장미}
delete_word = input('삭제할 단어 입력:')
if d.get(delete_word) == None :
print('삭제할 단어 없음')
continue #삭제할 단어가 없는데 삭제하는함수를 만나면 안돼므로 continue를 사용한다.
del d[delete_word]
f = open('word.txt','w')
for k in d :
f.write(k+'/'+d[k]+'\n')
f.close()
elif num == 5:
f = open('word.txt','r')
print('단어/뜻')
for line in f : #[rose/장미, cat/고양이, dog/개]
#[단어/뜻, 단어/뜻..] 이런식으로 리스트형태로 넘어온다. f는 readline이 생략 되어있다.
#line에 단어/뜻 하나가 들어온다.
print(line,end='')
f.close()
elif num == 6:
print('프로그램 종료')
break
else:
print('1~6만 입력 가능')
while True:
num = int(input('메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >>'))
- if num == '1' :
1을 문자열로 했다면,
num = input('메뉴 선택(1:단어입력, 2:단어검색, 3:단어수정, 4:단어삭제, 5:단어출력, 6:종료) >>')
이렇게 해도 된다.
if num == 1:
f = open('word.txt','a') -쓰기위한 파일을 연다. 추가가 되어야 하므로 'a' mode를 쓴다.
word = input('단어:')
mean = input('뜻:')
f.write(word+"/"+mean+"\n")
f.close()
elif num == 2:
flag = False
search_word = input('검색할 단어:')
f = open('word.txt','r') - 읽기 위한 오픈
for line in f:
line_split = line.split('/') - '/'로 구분되어서 리스트형태로 나온다.
# print(line_split)
if line_split[0] == search_word :
print(search_word,'의 뜻:',line_split[1])
flag = True
- 여기 for문이 끝나고 작성한다. 반복문 안에 작성하면 안된다.
if flag == False :
print('찾는 단어 없음')
f.close()
- 한쌍(key,value)으로 처리할때는 사전으로 처리하는것이 편하다
elif num == 3: # 수정
list_word=[] #단어만 넣는다.['rose','cat','desk']
list_mean=[] #뜻만 넣는다.['장미'~]
f = open('word.txt','r') #먼저 전체 읽어온다.
for line in f :
line_split = line.split('/') #[rose, 장미 \n] 방 2개짜리 리스트가 생긴다.
list_word.append(line_split[0]) # ['rose','cat','desk']
list_mean.append(line_split[1].strip()) # ['장미'~] '/'로 분리시켜서 list_mean에 넣는다.
d = dict(zip(list_word,list_mean)) #zip이라는 함수로 묶어서 dict함수를 사용해서 사전으로 만든다.
print('d:',d)
- 사전에서 수정할 단어를 찾는다.
update_word = input('수정할 단어 입력:')
if d.get(update_word) == None:
print('수정할 단어 없음')
continue #수정할 단어 없으면 밑에를 만나면 안되므로 continue 를 사용하여 멈추도록 한다.
update_mean = input('수정할 뜻 입력:')
d[update_word] = update_mean
f = open('word.txt','w')
for k in d : #key만 반복해서 들어간다.
f.write(k+'/'+d[k]+'\n')
f.close()
elif num == 4: - 삭제
list_word=[] # ['rose','cat','desk']
list_mean=[] # ['장미'~]
f = open('word.txt','r')
for line in f :
line_split = line.split('/')
list_word.append(line_split[0]) # ['rose','cat','desk'] # ['rose','cat','desk'] 단어를 분리하여 list_word에 넣는다.
list_mean.append(line_split[1].strip()) # ['장미'~] '/'로 분리시켜서 list_mean에 넣는다.
d = dict(zip(list_word,list_mean)) #{rose:장미}
delete_word = input('삭제할 단어 입력:')
if d.get(delete_word) == None :
print('삭제할 단어 없음')
continue #삭제할 단어가 없는데 삭제하는함수를 만나면 안돼므로 continue를 사용한다.
del d[delete_word]
f = open('word.txt','w')
for k in d :
f.write(k+'/'+d[k]+'\n')
f.close()
elif num == 5:
f = open('word.txt','r')
print('단어/뜻')
for line in f : #[rose/장미, cat/고양이, dog/개]
#[단어/뜻, 단어/뜻..] 이런식으로 리스트형태로 넘어온다. f는 readline이 생략 되어있다.
#line에 단어/뜻 하나가 들어온다.
print(line,end='')
f.close()
elif num == 6:
print('프로그램 종료')
break
else:
print('1~6만 입력 가능')
💻09_클래스
💾Ex05
#_*_coding:utf-8
'''
Created on 2022. 10. 6.
@author: admin
'''
class Super:
def __init__(self):
print("Super init")
def show(self):
print("Super show")
#자바와의 차이점은 자바에는 쓰지 않아도 부모의 생성자를 호출하는 super()가 자동으로 생성된다. super의 위치는 항상 맨위 처음에 있어야 한다.
#파이썬에서는 자동으로 생성되지 않으므로 부모의 생성자를 호출하고 싶다면 직접 작성해줘야 한다. super의 위치가 맨위에 있지 않아도 된다.
#class Sub extends Super:
class Sub : # Super는 부모가 되고, Sub는 자식이 된다.
def __init__(self):
print("Sub init")
super().__init__() #숨어있는 object라는 클래스를 상속을 받는다(모든 클래스가 자바처럼) 아무것도 없어서 에러날것이 없다
#Super.__init__(self) #부모의 생성자를 호출하려면 작성을 해줘야만 한다. 자동으로 호출안됨, 위치가 맨위에 있지 않아도 된다.
def show(self):
Super.show(self) #부모가 물려준 show 를 작성해주면 출력해볼수있다. 부모의 show를 호출해라
#상속관계가 아니더라도 다른클래스의 메서드를 호출할수있다
print("Sub show")
class Sub2(Super):
pass #자기 생성자(Sub2)를 따로 만들지 않으면, 부모생성자가 자동으로 호출이 된다.
class Sub3(Super):
def __init__(self):
#Super.__init__(self)
super().__init__()
print("Sub3 init")
def show(self):
#Super.show(self)
super().show() #부모의 show를 호출하고싶다. 부모의 super().를 사용해서 생성자나 메서드를 사용할때는 self를 넘기면 안돼고, 부모의 이름을 직접사용 Super. 로 사용할때는 self를 써서 직접 넘겨줘야한다.
print("Sub3 show")
#super() - 부모의 생성자에 접근하는 방식
#super. -부모의 변수나 부모의 메서드에 접근하는 방식
s3 = Sub3() #객체를 만들면 생성자로 넘어간다.
s3.show()
print()
s1 = Super()
s1.show()
print()
#자식의 생성자가 있으면, 부모의 생성자가 호출이 될 수도 있고 안될수도있다.
s2 = Sub()
s2.show()
print()
#부모가 물려준 생성자와 show() 그리고 자기생성자와 자기show()까지 출려된다
s3 = Sub2() #Super init -부모의생성자가 호출되어 출력된다.
s3.show() #Super show -부모의 show를 호출하여 출력
- 자바와의 차이점은 자바에는 쓰지 않아도 부모의 생성자를 호출하는 super()가 자동으로 생성된다. super의 위치는 항상 맨위 처음에 있어야 한다.
- 파이썬에서는 자동으로 생성되지 않으므로 부모의 생성자를 호출하고 싶다면 직접 작성해줘야 한다. super의 위치가 맨위에 있지 않아도 된다.
class Super:
def __init__(self):
print("Super init")
def show(self):
print("Super show")
#class Sub extends Super:
class Sub : - Super는 부모가 되고, Sub는 자식이 된다.
def __init__(self):
print("Sub init")
super().__init__() - 숨어있는 object라는 클래스를 상속을 받는다(모든 클래스가 자바처럼) 아무것도 없어서 에러날것이 없다
#Super.__init__(self) - 부모의 생성자를 호출하려면 작성을 해줘야만 한다. 자동으로 호출안됨, 위치가 맨위에 있지 않아도 된다.
def show(self):
Super.show(self) - 부모가 물려준 show 를 작성해주면 출력해볼수있다. 부모의 show를 호출해라
- 상속관계가 아니더라도 다른클래스의 메서드를 호출할수있다
print("Sub show")
class Sub2(Super):
pass - 자기 생성자(Sub2)를 따로 만들지 않으면, 부모생성자가 자동으로 호출이 된다.
class Sub3(Super):
def __init__(self):
#Super.__init__(self)
super().__init__()
print("Sub3 init")
def show(self):
#Super.show(self)
super().show()
- 부모의 show를 호출하고싶다. 부모의 super().를 사용해서 생성자나 메서드를 사용할때는 self를 넘기면 안돼고, 부모의 이름을 직접사용 Super. 로 사용할때는 self를 써서 직접 넘겨줘야한다.
print("Sub3 show")
#super() - 부모의 생성자에 접근하는 방식
#super. -부모의 변수나 부모의 메서드에 접근하는 방식
s3 = Sub3() - 객체를 만들면 생성자로 넘어간다.
s3.show()
print()
s1 = Super()
s1.show()
print()
- 자식의 생성자가 있으면, 부모의 생성자가 호출이 될 수도 있고 안될수도있다.
s2 = Sub()
s2.show()
print()
- 부모가 물려준 생성자와 show() 그리고 자기생성자와 자기show()까지 출려된다
s3 = Sub2() - Super init -부모의생성자가 호출되어 출력된다.
s3.show() - Super show -부모의 show를 호출하여 출력
💾Ex06
#_*_coding:utf-8
'''
Created on 2022. 10. 7.
@author: admin
'''
#생성자 통해서
#출력하는 함수를 통해서 이름과 나이를 출력한다.
class Person:
def __init__(self,name,age=None): #age=10을 넣어서 초기화하여 기본값이 10이 되게한다, 기본값 설정안하려면 age=None 뭐라도 넣어줘야한다.
print('Person생성자')
self.name = name
self.age = age
def show(self):
print(self.name,self.age)
def __str__(self): # __str__ 이라고 함수를 정의하면 , 메서드 호출하지 않아도 자동으로 호출된다 show=str 같은 기능을 가진함수이다
return "Person %s %s" % (self.name,self.age)
#Person클래스 상속받음
class Employee(Person):
def __init__(self,name,age,position,salary):
super().__init__(name, age)
#Person.__init__(self, name, age) 부모의 이름을 가져와서 써도 된다.
self.position = position
self.salary = salary
def __str__(self):
#return "Employee %s %s %s %s" % (self.name,self.age,self.position,self.salay) 이렇게 해도 되지만 부모의 str을 상속받는 방법을 쓴다.
#return super().__str__()+" Employee %s %d" % (self.position,self.salary) 상속을 받아서 사용하는 방법
return Person.__str__(self)+" Employee %s %d" % (self.position,self.salary) #부모의 이름을 쓸때는 self를 꼭 쓴다
p1 = Person('수지', 30)
p1.show()
print('p1:',p1.__str__()) #p1.__str__() = __str__()함수를 생략해도 된다. (=자바의 toString)
print(p1.name)
print(p1.age)
p2 = Person('박보검') #기본 나이 10살로 설정되게 한다.
p2.show()
print('p2:',p2)
print('--------------')
e1 = Employee('윤아',20,'대리',200)
e2 = Employee('정국',40,'과장',300)
print('e1:', e1) #윤아',20,'대리',200 이대로 나올수 있도록 해본다.
print('e2:', e2) #'정국',40,'과장',300
- 생성자 통해서
- 출력하는 함수를 통해서 이름과 나이를 출력한다.
class Person:
def __init__(self,name,age=None):
- age=10을 넣어서 초기화하여 기본값이 10이 되게한다, 기본값 설정안하려면 age=None 뭐라도 넣어줘야한다.
print('Person생성자')
self.name = name
self.age = age
def show(self):
print(self.name,self.age)
def __str__(self):
- __str__ 이라고 함수를 정의하면 , 메서드 호출하지 않아도 자동으로 호출된다 show=str 같은 기능을 가진함수이다
return "Person %s %s" % (self.name,self.age)
#Person클래스 상속받음
class Employee(Person):
def __init__(self,name,age,position,salary):
super().__init__(name, age)
#Person.__init__(self, name, age) - 부모의 이름을 가져와서 써도 된다.
self.position = position
self.salary = salary
def __str__(self):
#return "Employee %s %s %s %s" % (self.name,self.age,self.position,self.salay)
- 이렇게 해도 되지만 부모의 str을 상속받는 방법을 쓴다.(상속 안받은 방법)
#return super().__str__()+" Employee %s %d" % (self.position,self.salary) - 상속을 받아서 사용하는 방법
return Person.__str__(self)+" Employee %s %d" % (self.position,self.salary) - 부모의 이름을 쓸때는 self를 꼭 쓴다
p1 = Person('수지', 30)
p1.show()
print('p1:',p1.__str__()) - p1.__str__() = __str__()함수를 생략해도 된다. (=자바의 toString)
print(p1.name)
print(p1.age)
p2 = Person('박보검') #기본 나이 10살로 설정되게 한다.
p2.show()
print('p2:',p2)
e1 = Employee('윤아',20,'대리',200)
e2 = Employee('정국',40,'과장',300)
print('e1:', e1) #윤아',20,'대리',200 이대로 나올수 있도록 해본다.
print('e2:', e2) #'정국',40,'과장',300
💾Ex07
#_*_coding:utf-8
'''
Created on 2022. 10. 7.
@author: admin
'''
#자바에서는 한번에 상속을 받을 수 없다. 대를 거쳐러 조상-부모-자식 이렇게는 상속을 여러개 받을 수 있다.
#파이썬은 한번에 다중상속이 가능하다!
class Tiger:
def jump(self):
print('호랑이 jump')
def cry(self):
print('호랑이 어흥')
class Lion:
def bite(self):
print('사자 bite')
def cry(self):
print('사자 으르렁')
class Liger(Tiger,Lion):
def play(self):
print('라이거와 놀기')
l = Liger()
l.play()
l.jump()
l.bite()
l.cry() # Tiger,Lion 에 cry가 둘다 있을때, 먼저 상속받은 부모의 cry가 호출이 된다.
#자바에서는 한번에 상속을 받을 수 없다. 대를 거쳐러 조상-부모-자식 이렇게는 상속을 여러개 받을 수 있다.
#파이썬은 한번에 다중상속이 가능하다!
class Tiger:
def jump(self):
print('호랑이 jump')
def cry(self):
print('호랑이 어흥')
class Lion:
def bite(self):
print('사자 bite')
def cry(self):
print('사자 으르렁')
class Liger(Tiger,Lion):
def play(self):
print('라이거와 놀기')
l = Liger()
l.play()
l.jump()
l.bite()
l.cry() # Tiger,Lion 에 cry가 둘다 있을때, 먼저 상속받은 부모의 cry가 호출이 된다.
💾Ex08
#_*_coding:utf-8
'''
Created on 2022. 10. 7.
@author: admin
'''
# 연산자 오버로딩
class NumBox:
def __init__(self,num):
self.num = num
self.num2 = num
def __add__(self,num):
self.num += num
return '더하기(add)' +str(self.num)
def __radd__(self,num):
self.num += num
return '더하기(radd)' +str(self.num)
def __sub__(self,num):
self.num -= num
return '빼기(sub)' +str(self.num)
num = NumBox(40) #num변수가 관리하는곳에 num,num2가 있다
print(num.num) #40 , num.num =참조변수이다.
print(num.num+50) #90
print(num+50) # num은 참조변수 + 숫자 : __add__함수가 자동으로 호출이 되어 내가 넘기는 50이 add함수의 num으로 들어가서 더해져(str문자열로 바꿔) self.num=90된다.
print(10 + num.num)
print(10 + num) #숫자+참조변수 :뒤에 참족변수가 있으면__radd__ 가 호출이 되어 더해져 100이 된다.
# +가 더하기가 아닌 함수를 부르는 기능, =연산자 오버로딩
print(num.num-3)
print(num-3)
# 연산자 오버로딩
class NumBox:
def __init__(self,num):
self.num = num
self.num2 = num
def __add__(self,num):
self.num += num
return '더하기(add)' +str(self.num)
def __radd__(self,num):
self.num += num
return '더하기(radd)' +str(self.num)
def __sub__(self,num):
self.num -= num
return '빼기(sub)' +str(self.num)
num = NumBox(40) #num변수가 관리하는곳에 num,num2가 있다
print(num.num) #40 , num.num =참조변수이다.
print(num.num+50) #90
print(num+50) # num은 참조변수 + 숫자 : __add__함수가 자동으로 호출이 되어 내가 넘기는 50이 add함수의 num으로 들어가서 더해져(str문자열로 바꿔) self.num=90된다.
print(10 + num.num)
print(10 + num) #숫자+참조변수 :뒤에 참족변수가 있으면__radd__ 가 호출이 되어 더해져 100이 된다.
# +가 더하기가 아닌 함수를 부르는 기능, =연산자 오버로딩
print(num.num-3)
print(num-3)