[내일배움단 ai트랙 3기]파이썬 문법(4)

2022. 9. 14. 00:01스파르타코딩클럽[AI트랙 3기]/TIL

22.09.13

  오늘 다시 파이썬으로 돌아왔다. class라는 개념을 배웠는데 도대체 이것을 쓰는 이유가 무엇인가요? 대충 이해한 바로는 중앙에서 한번에 여러 객체? 인스텐스?들을 관리 하기 위함인 것 같은데 제대로 이해한지도 모르겠고 구조도 정확하게 머리에 안들어온다. 반복숙달이 답이겠지. 오늘 저녁에는 권기현튜터님께서 조별로 면담을 해주셨다. 아주 다행히도 지금 진도를 따라가기 어려운 인원들에 한해서 보충수업을 해주신다고 한다. 새로 배우는 마음으로 차근차근 시작해야겠다. 신이 주신 마지막 기회라고 생각... 제발~~~~~~~~~~~


ㅁ파이선 원격 강의 (이창호 튜터님)

*1교시

ㅇ숫자야구 해설

-막막할때는 큰 과제를 하나의 작은 알고리즘으로 나눈 다음, 각 기능을 개발하고 합치면 완성

1.랜덤한 숫자 만들기(방법이 다양함)

#case 1 input()이용

#length = input()

import random

length = 5

number_list = [0,1,2,3,4,5,6,7,8,9]

random.shuffle(number_list)

해주면 됨. 그런데 length를 바꿔줄수 있다. length = random.randrange(0,9)

random_numbers = number_list[0:length]

print(random_numbers)

 

#case 2 pop 이용

-내가 원하는 위치의 요소를 뺀다음 변수에 할당 가능

number_list = [x for x in range(10)] range10이면 0부터 9까지를 x에 담고 x가 리스트에 담기면서 number_list에 담기게 됨.

random_number = number_list.pop()

 

print(number_list) > [0~8]

print(random_number) > 9

pop(숫자)하면 마지막 숫자가 아닌 숫자를 빼버림.

length = 5

number_list = [x for x in range(10)]

random_numbers=[]

for_in range(length) :

random_numbers.append(number_list.popo(random.randrange(0, len(number_list))))

 

print(number_list)

print(random_numbers)

 

#case 3

random_numbers = {} #set으로 준 것

while len(random_numbers) < length:

random_numbers.add(random.randint(0,9)) *range는 포함 안하고 int는 포함 함.

 

그러면 random_numbers = 뒤에 {} 대신 set()을 적어줌.

set자료형은 순서가 없음. 숫자가 커지면 정렬을 안함. 10 이하의 작은 숫자는 정렬을 해버림. 그래서 rand_numbers = list(rand_numbers) 해서 list로 바꾸주고 shuffle을 해줌.

 

2. 프로그램이 시작된 시간을 기록한다.

import time

start time = time.time()

 

3.사용자의 입력을 받고, 입력 받을 때 마다 try count를 1씩 더해준다.

try count = 0

 

input_number = input(“값을 입력해주세요 :”)

try_count +=1

 

4.사용자 입력 x와 랜덤하게 생선된 y 두 숫자를 비교한다.

enumrate 홀용

for i , v in enumerate(input_number):

하면 순서대로 인덱스 번호, 해당하는 인덱스의 숫자

그리고 밑에 v= int(v) #자료형을 정수로 바꿔줌

if v not in random_numbers : #포함이 돼있지 않은 경우

out count += 1

해줘야하는데 out count가 없으니까 위에 out_count = 0

else : #포함이 돼 있는 경우

if random_numbers[i] == v:

strike_count += 1

else :

ball_count+=1
그리고 위에 ball_count, strike_count도 같이 추가해줌.

 

5.사용자가 exit을 입력하거나 맞출때까지 무한 반복한다. 

while True: 로 묶어줌.

 

6.사용자의 입력이 1번에서 생성한 숫자와 일치할 경우 필요한 정보를 출력하고 프로그램 종료

if strike_count == length:

print(“####################”)

print(“정답”)

print(f“소요시간 : {time.time() -start_time}”)

print(f“클리어 일자 : {datetime.now()}”)

print(f“도전 횟수: {try_count}”)

print(“####################”)

return

 

print(f“{ball_count}{strike_count}스트라이크 {out_count}아웃”)

부등호를 쓰려면 lengthint가 와야함. 맨위 length = int(input())으로 감사해야함.

소수점 둘째자리까지 표현하게 하기 :.2f

 

+)추가질문

1)return의 의미

return은 함수 안에서 쓰임.

def 특정_함수() :

print(“hello world!!”)

특정_함수() 하면 실행됨.

def 숫자_더하기 (num1, num2):

return num1 + num2

print(숫자_더하기 (5,10))

return뒤에 다른 것을 입력해도 작동 안됨.

 

2)랜덤숫자생성 여러방법중 어떤 것을 써야할까?

제일 이해잘되는 코드 이용. 만약 숫자가 커지면 코드별로 속도가 달라짐. 그럴때는 시간을 비교해서 더 짧게 걸리는 것을 활용.

 

*2교시

하나씩 중간중간 print 찍어보기.

파이썬 심화

-class : 클래스 선언은 과자틀만들기, 선언된 가자로 instance는 과자를 만드는 것

클래스 안에 함수를 지정하는 것을 메소드라고 함. 클래스 함수라고도 한다.메소드 선언시에는 항상 self를 넣어줘야함. def set_cookie_name(self, name):

 

*3교시

각 인스탠스는 상관이 없음.

mutable, immutable

 

ㅁ초보코딩 유튜브

-클래스는 자기소개서다.

name = “김철수” , age = 28

name = “김안녕” , age = 25

 

ㅁ생활코딩

class 안에 여러 변수와 함수가 있음. 연관성 있는 것들을 묶어버림.

정보를 저장하는 그릇 > 변수 / 여러 가지 로직을 그룹핑 한 것 > 함수

클래스를 복사해서 클래스와 같은 인스턴스를 만듬. 각각의 인스턴스에 모든 것이 들어있음. 각각 함수가 동작하는 방법이 달라진다.

객체는 엄격하게 인스턴스를 객체라고 함.

객체지향프로그래밍에서는 

-함수 대신에 메소드, 행위

-변수 대신에 속성,필드,상태

 

#class 만들기

c1 = cal(10, 10)

print(c1.add())

print(c1.subtract())

 

c2 = cal(32, 20)

print(c2.add())

print(c2.subtract())

 

-객체제작 3 : 클래스 정의

class cal(object):

 

c1 = cal(10, 10)

print(c1.add())

print(c1.subtract())

 

c2 = cal(32, 20)

print(c2.add())

print(c2.subtract())

 

-객체제작 4 : 생성자

생성자 construct

메소드 정의

def __init__(self,v1,v2):

 

c1 = cal(10, 10)

#print(c1.add())

#print(c1.subtract())

 

c2 = cal(32, 20)

#print(c2.add())

#print(c2.subtract())

해주면 츨력은

10 10

32 20

이렇게 되는데 이때 10v1으로 갔다가 print v1으로 넘어와서 출력되는 것임.

 

-객체제작 5-2 : 인스턴스 변수와 메소드

파이썬의 메소드들은 첫 번째 매게변수를 꼭 정의해야함(self)

첫 번째 매게변수는 언제나 그 인스턴스가 됨. 관습적으로 self를 써줌.

class cal(object):

def __init__(self, v1, v2):

self.v1 = v1

self.v2 = v2

def add(self):

return self.v1 + self.v2

def subtract(self):

return self.v1 - self.v2

 

c1 = cal(10, 10)

print(c1.add())

print(c1.subtract())

c2 = cal(32, 20)

print(c2.add())

print(c2.subtract())

 

-객체 제작 6 :객체를 사용하는 이유

 

클래스는 제품의 설계도. 하나의 클래스로 여러개 객체를 만들 수 있음.

속성 클래스안의 변수, 메소드 클래스안의 함수. 생성자 객체를 만들 때 가장먼서 실행되는 함수, 인스턴스 메모리에 살아있는 객체

1)클래스 만들기

class 클래스이름 :

def 메소드이름(self):

명령블록

>>>>

class Monster:

def say(self):

print(“나는 몬스터다”)

2)클래스 사용하기

객체 = 클래스이름()

객체.메소드() (.~의로 해석하면됨.)

>>>

shark = Monster()

shark.say()

3)속성 추가하기

class Monster

def __init__(self, name) :

self.name = name

def say(self)

print(f“나는{self.name}”)

 

shark = Monster(“상어”)

 

그러면 젤 먼저 init으로 name에 상어가 들어감. self 자리에는 만들고 있는 자기 자신이 들어감. self에는 그럼 shark가 들어감. shark 객체의 이름을 상어로 만들겠다. 라는 뜻임.

shark.say() 하면 나는 상어다.’라고 나옴.

wolf = Monster(“늑대”)

 

4)최종정리

class monster:

def__init__ (self. name, age):

self.name = name

self.age = age

def sat(self):

print(f“나는 {self.nae}, {self.age}살임”)

 

shark = monster(‘상어’, 7)

wolf= monster(‘늑대’, 4)

shark.say()

wolf.say()

하면 결과는 나는 상어 7살임, 나는 늑대 4살임. 이라는 결과가 나옴.

 

상어의 속성(공격력, 이동속도, 체력, 방어력) / 메소드(이동하기, 공격하기, 스킬쓰기)등을 넣을 수 있음.