파이썬입문 겨울방학 특강 (4)
- 무슨말인지 하나도 몰랐어요
- 요즘 학생들이 많이 쓰는 말인것은 알겠음
- 멈춰까지 유행어였음!! (몰랐어요, 댓글보고 알았음)
Step1: 멈춰의 원조: 학교폭력, 멈춰~
Step2: 갑자기 뒤늦게 재미있음 $\to$ 밈화
- ㅇㅇㅇ, 멈춰~~~!로 따라하기 시작함
- 코스피하락, 멈춰~
- 세균, 멈춰~
- 수강신청 매크로, 멈춰~
- 밈이란? 복제가능한 something
- 이기적 유전자에서 제시한 개념
- 유전자는 (1) 복제 (2) 변형되면서 전파되는 속성이 있다는 사실을 관찰
- 종교, 사상, 이념도 유전자처럼 (1) 복제 (2) 변형되면서 전파되더라..
- 밈 = 유전자의 일반화된 개념 = 복제가능한 something
- 예제1: 원본
print("학교폭력")
from PIL import Image
display(Image.open('2022-01-02-stop1.jpeg'))
print("멈춰~~~~~")
- 예제2: 코스피하락
print("코스피하락,")
display(Image.open('2022-01-02-stop1.jpeg'))
print("멈춰~~~~~")
- 예제3: 수강신청 매크로 멈춰
print("수강신청 매크로,")
display(Image.open('2022-01-02-stop1.jpeg'))
print("멈춰~~~~~")
- 정리해보자.
start = "학교폭력"
img = '2022-01-02-stop1.jpeg'
end = "멈춰~~~~~~~"
def memeshow(start, img, end):
print(start)
display(Image.open(img))
print(end)
- 예제1을 재생성
memeshow(start,img,end)
- 예제2를 재생성
start = "코스피 하락,"
memeshow(start,img,end)
- 예제3의 재생성
start = "수강신청 매크로,"
memeshow(start,img,end)
- 코드를 정리하다 보니까 살짝 비효율적인 느낌이 있음
- major: 여러개의 콘텐츠를 동시에 관리하기가 힘들다.
- minor: start, img, end와 같은 변수들이 정리가 되어있지 않고 산만한 느낌이 든다.
부장님: 예제1을 생성하라
start = "학교폭력, "
memeshow(start,img,end)
부장님: 예제2를 생성하라.
start = "코스피하락,"
memeshow(start,img,end)
부장님: 예제2에서 멈춰~ㅠㅠ 로 바꿔봐라. 좀 더 간절함이 느껴지도록..
end = "멈춰~~~ㅠㅠ"
memeshow(start,img,end)
부장님: OK 다시 예제1로 가봐
start = "학교폭력,"
memeshow(start,img,end)
부장님: 아니, 멈춰는 그대로 해야지. 여기서 우니까 애들이 더 괴롭힐것 같잖아
end = " 멈춰~~~~"
memeshow(start,img,end)
부장님: OK. 이제 이미지를 바꿔보자 신혜선 나오는것 어떰? 내가 신혜선 좋아함.
img = '2022-01-02-stop2.png'
memeshow(start,img,end)
부장님: 좋다. 이제 2개의 컨텐츠를 동시에 보여봐. 점검을 해보자.
(예제1)
start= "학교폭력,"
img = "2022-01-02-stop2.png"
end = "멈춰~~~~"
memeshow(start,img,end)
(예제2)
start= "코스피하락,"
img = "2022-01-02-stop1.jpeg"
end = "멈춰~~ㅜㅜ"
memeshow(start,img,end)
- 클래스가 없다면? 살짝 비효율적인 느낌이 있음
- major: 여러개의 콘텐츠를 동시에 관리하기가 힘들다. (예제1, 예제2 동시에 관리하니까 힘들었어요)
- minor: start, img, end와 같은 변수들이 정리가 되어있지 않고 산만한 느낌이 든다.
- HWP를 켜서 부장님의 지시를 수행했다면?
- 부장님의 공통 지시사항을 추린다. (start, img, end와 같은 요소가 필요하고 그림을 삽입하는 기술도 필요하겠음)
- 소스가 되는 hwp파일을 하나 만든다. 복사를 위한 틀이다. 파일이름은 KBS.HWP라고 하자.
- KBS.HWP파일을 복사 $\to$ stop1.hwp, stop2.hwp 파일을 만든다. 그리고 부장님이 지시사항이 있을때마다 stop1.hwp, stop2.hwp의 내용을 각각 수정한다.
- 단점이 극복될까요?
- major: 여러개의 콘텐츠를 동시에 관리하기가 힘들다. $\to$ 샘플파일과 각각의 복사본을 나누어서 독립적으로 관리하므로 이 문제는 해결
- minor: start, img, end와 같은 변수들이 정리가 되어있지 않고 산만한 느낌이 든다. $\to$ stop1.hwp, stop2.hwp와 같은파일안에 내용이 있으므로 산만하지 않음.
- 방금 말한 HWP와 같은 방식을 코딩에 적용해보자.
class KBSHWP:
start = '학교폭력,'
img = '2022-01-02-stop1.jpeg'
end = '멈춰~~~~'
def memeshow(self): ## 규칙1: class안에 정의된 함수의 첫번째 인자는 무조건 self
print(self.start) ## 규칙2: class안에 정의된 변수를 쓰려면 self.변수이름 과 같은 형식으로 써야함
display(Image.open(self.img)) # 규칙2 적용
print(self.end) # 규칙2 적용
부장님: 예제1을 생성하라
stop1 = KBSHWP()
stop1.memeshow()
부장님: 예제2를 생성하라.
stop2 = KBSHWP()
stop2.start = '코스피하락,'
stop2.memeshow()
부장님: 예제2에서 멈춰~ㅠㅠ 로 바꿔봐라. 좀 더 간절함이 느껴지도록..
stop2.end = '멈춰~ㅠㅠ'
stop2.memeshow()
부장님: OK 다시 예제1로 가봐
stop1.memeshow()
부장님: 아니, 멈춰는 그대로 해야지. 여기서 우니까 애들이 더 괴롭힐것 같잖아
부장님: OK. 이제 이미지를 바꿔보자 신혜선 나오는것 어떰? 내가 신혜선 좋아함.
stop1.img = '2022-01-02-stop2.png'
stop1.memeshow()
부장님: 좋다. 이제 2개의 컨텐츠를 동시에 보여봐. 점검을 해보자.
(예제1)
stop1.memeshow()
(예제2)
stop2.memeshow()
성능1: 틀만있으면 여러개의 독립적인 컨텐츠를 생성할 수 있다.
stop1 = KBSHWP()
stop2 = KBSHWP()
성능2: 생성된 컨텐츠(=인스턴스, 오브젝트)에서 .을 찍고 접근할 수 있는 여러 자료들에 접근가능하고 그 내용물도 바꿀 수 있다.
stop2.start
stop2.start = '코스피하락,'
stop2.start
성능3: 생성된 컨텐츠(=인스턴스, 오브젝트)에서 .을 찍고 쓸 수 있는 자체적인 함수(=메소드)를 독립적으로 사용할 수 있다.
stop1.memeshow()
성능 4,5,6.... 그 밖의 미공개된 성능이 많음
- 선언하는 방법 (= 양식문서를 만드는 방법)
class KBSHWP: ## 양식의 이름을 설정
start = '학교폭력,' ## 양식에 포함된 변수 1
img = '2022-01-02-stop1.jpeg' ## 양식에 포함된 변수2
end = '멈춰~~~~' ## 양식에 포함된 변수3
def memeshow(self): ## 양식에 포함된 함수1 = 메소드1
print(self.start)
display(Image.open(self.img))
print(self.end)
- 규칙1: 메소드(=class안에서 정의된 함수)의 첫번째 인자는 무조건 self
- 규칙2. 메소드에서 class안에서 정의된 변수를 사용하려면 self.변수이름과 같은 꼴로 써야한다.
- self.start, self.img, self.end와 같은 방식으로 써야 한다.
- KBSHWP.start, KBSHWP.img, KBSHWP.end 와 같은 방식으로 쓰는 경우도 가끔있다. (필요에 따라)
- 성능1을 사용하는 방법: 클래스에서 인스턴스를 생성하는 방법
stop1 = KBSHWP() ##
stop2 = KBSHWP()
- 함수사용법이랑 비슷
- 클래스 이름을 쓰고 콘텐츠를 구체화하는 과정에서 필요한 입력1, 필요한 입력2 를 ()에 넣는다.
- 현재는 따로 들어가는 입력이 없으므로, 그냥 KBSHWP 이후에 입력을 비워둔다. 즉
KBSHWP()로 생성.
- 성능2를 사용하는 방법: 인스턴스에서 .을 찍고 접근하고 싶은 속성에 접근, 혹은 변경
stop2.start
stop2.start = '코스피하락,'
stop2.start
- 성능3을 사용하는 방법: 인스턴스에서 .을 찍고 사용하고 싶은 메소드를 사용
stop2.memeshow()
class KBSHWP2:
title = '[컨텐츠1]'
start = '학교폭력,'
img = '2022-01-02-stop1.jpeg'
end = '멈춰~~~~'
def memeshow(self):
print(self.title)
print(self.start)
display(Image.open(self.img))
print(self.end)
stop3=KBSHWP2()
stop3.memeshow()
- 클래스내에는 변수 a가 있다. 변수 a의 초기값은 True이다.
- 클래스에는 show()라는 메소드가 있다. show()의 기능은 a값을 출력하는 것이다.
(풀이)
class AAAA:
a= True
def show(self):
print(self.a)
aaaa = AAAA()
aaaa.a
aaaa.show()
aaaa.a = False
aaaa.show()
- 클래스내에는 변수 a가 있다. 변수 a의 초기값은 1이다.
- 클래스에는 up()이라는 메소드를 가지고 있다. 이 메소드의 기능은 a의 값을 1증가시키는 것이다.
(풀이)
class Temp:
a= 1
def up(self):
self.a=self.a+1
temp= Temp()
temp.a
temp.up()
temp.a
- 클래스내에는 변수a가 있다. 변수a의 초기값은 0이다.
- 클래스에는 up(), down(), show() 라는 메소드가 있다. 각각의 기능 a의 값을 1증가, 1감소, 출력 하는 기능을 가진다.
(힌트)
class Temp2:
a = 0
def up(self):
self.a= self.a+1
def down(self):
self.a = self.a-1
def show(self):
print(self.a)
temp = Temp2()
temp.a
temp.down()
temp.show()
temp.up()
temp.up()
temp.show()
- 기능1: 2022-01-02-stop1.jpeg을 보여줌
- 기능2: 당신은 이 그림을 n번 보았습니다.를 출력 여기에서 $n$은 그림을 본 횟수
class Temp3:
n=1
img= '2022-01-02-stop1.jpeg'
def show(self):
display(Image.open(self.img))
print('당신은 이그림을 %s 번 보았습니다' % self.n)
self.n=self.n+1
temp3 = Temp3()
temp3.show()
temp3.show()
temp3.show()
temp4 = Temp3()
temp4.img = '2022-01-02-stop2.png'
temp4.show()
temp4.show()
temp3.show()
temp4.show()