[내배캠 AI코스] TIL

내일배움캠프 10일차 TIL - 파이썬 문법 기초(3)

띵제 2024. 2. 24. 20:28

오늘 들은 강의 : 파이썬 문법 기초 강의

 

2. 파이썬 문법 뽀개기 - 심화

2-2. 튜플, 집합

 

1) 튜플 (tuple)

리스트와 똑같이 생겼는데 변하지 않는 자료형, 불변형이다. 순서도 존재한다.

 

 

[ ] 쓰는 리스트와 다르게 ( ) 쓰는데,

이렇게 했을 때는 똑같이사과 출력된다.

하지만 리스트에서처럼 다른 값을 추가해주려고 하면 (변형하려고 하면)

 

바로 에러가 떠버린다.

그렇다면 튜플은 언제 주로 사용할까?

 

위에는 우리가 계속 실습해왔던 리스트 안에 딕셔너리가 있는 모습이다.

하지만 실무에서는 필요에 따라 아래처럼 딕셔너리가 아닌 튜플을 넣어줄 때가 있다.

자료가 변하면 안될 쓰는듯.

그렇지만 초보인 우리가 2번째줄을 확률은 거의 없으니 그냥 참고만 하고 넘어가자.

 

2) 집합 (set)

a = [1,2,3,4,5,3,4,2,1,2,4,2,3,1,4,1,5,1]

 

a_set = set(a)

 

print(a_set)

 

이렇게 집합을 이용해 줬을 결과는 ‘1, 2, 3, 4, 5’ 나온다.

, 중복을 제거해준다.

 

뿐만 아니라 교집합/ 합집합/ 차집합도 구분할 있다.

 

이렇게 교집합을 구하면

결과는 {'참외', '사과', '귤'} 

중복되는 교집합 값들만 구해진다.

합집합도 마찬가지다.

! 

 

Q. 구글링문제 - A 들은 수업 , B 듣지 않은 수업을 찾아보기

차집합을 활용하면 되겠다.

 

student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']

student_b = ['물리1','수학1','미술','화학2','체육']

 

a_set = set(student_a)

b_set = set(student_b)

 

print(a_set - b_set)

 

차집합을 하는 법은 그냥 a_set 에서 b_set 빼주면 된다.

 

 

2-3. f-string

1) 변수로 직관적인 문자열 만들기

 

이렇게 학생들 이름과 점수를 넣어놓고

반복문을 통해 이름과 점수를 출력해볼 있다.

여기에서 출력되는 내용을 조금 직관적으로 바꿔보자.

대략 이런 식으로.

 

점수도 100점이 아니라 위의 데이터의 점수를 넣어주면 되겠다.

띄어쓰기 챙겨줘야 한다.

이제 실행시켜보면,

 

에러다.

 

여기서 score 숫자열이었기 때문이다.

print 에서 score str(score) 문자열로 바꿔준다.

 

문자열> 숫자열 바꾸는건 int() 

숫자열> 문자열 바꾸는건 str()

그런데 이게 데이터가 엄청 많으면 쓰기 어려울 것이다.

이럴 f-string 써주는 거다.

 

이렇게 앞에 f 넣어주고 변수는 { } 안에 넣어주면 되기 때문에

실제 코딩을 훨씬 깔끔하고 편하게 사용할 있다.

 

 

2-4. 예외처리

 

1) try - except

 

평소처럼 데이터를 불러와보면

이렇게 계속 봐왔던 식과 계속 봐왔던 결과가 나올 것이다.

지금은 이름과 나이가 전부 데이터가 차있지만,

만약 데이터가 없다면 어떻게 될까?

 

queen 나이를 지워본다.

그리고 실행을 시켜보면 어김없이 에러가 뜨는 것을 확인할 있다.

?!

 

, if 넣어준다. 

그랬을 데이터가 없으면 오류가 것이다.

이렇게.

 

우리가 데이터를 넣어주는 것이라면 상관없을 수도 있으나,

만약 서버에서 데이터를 가져오는 것이라면

데이터 개가 없을 때마다 에러가 나면 불편을 겪겠지.

그래서 이럴때 써주는 것이 바로 try - except 문이다.

 

try ; if 문을 실행해봐

except ; 아니면 "sorry, I don't understand" 출력해줘. 

 

하면 에러가 .

또또또또 들여쓰기 문제. 

 

들여쓰기 해주고 다시 실행하면

 

요렇게 출력이 되는 확인할 있다.

에러 메세지를 어떻게 설정할 것인지는 자유롭게 바꿀 있고,

어디에서 에러가 났는지 직관적으로 알기 쉽게 하려면

에러메세지에 person[‘name’] 넣어주면 쉬울 것이다.

 

try - except 문을 쓰면

에러도 안나고 좋을 같지만

마구마구 남용한다면 참사가 발어질 있다.

계속 실행은 되는데 점점 이상해지는.. 무슨 에러가 났는지도 모르는채..

그래서 이런게 있다는 것만 알아두고 넘어가는 것이 좋겠다.

 

 

2-5. 파일 불러오기

 

1) 여러개 파일로 분리하려면

main_func.py 파일과 main_test.py 파일을 생성해준다.

main_func.py 파일을 먼저 열어 여러가지 함수를 써준다.

 

그리고 main_test.py 파일로 넘어가서

아래와 같이 적어준다.

 

그러면 main_func.py에 있는 함수들을 가져와 사용할 수 있게 된다

import * 이라고 하면 모든 함수들을 쓸 수 있다는 뜻...

인데 이러면 에러가 난다.

에러 하나하나에 짜증을 내지 말고

앞으로 100만번쯤 더 볼테니 의연해지고 친숙해지자(?)

main_func.py에 있는 함수 중 say_hello_to 를 쓸거니까

import say_hello_to를 적어주자.

 

그러고 실행을 시켜주면,

main_func.py에서 설정한 내용 고대로 출력이 된다.

 

2-6. 한줄의 마법

 

1) if - 삼항연산자

 

 

같은 내용이지만 이렇게 쓸 수도 있고,

위에서 배웠던 f-string 써서 아래와 같이 쓸 수도 있다.

 

num = 3

 

if num % 2 == 0:

    result = '짝수'

else:

    result = '홀수'

 

print(f'{num} {result}입니다.')

 

이렇게 print 해보면,

‘3 홀수 입니다.’라고 나온다.

 

둘 중에 편한걸로 쓰면 되는데,

여기서 쫌 더 노력한다면 최대한 많은 내용들을 한 줄에 몰아서 쓰는게 가능하다.

 

result = ('짝수' if num % 2 == 0 else '홀수')

 

순서대로 직역하면 

1)짝수라고 해라 2) 2 나눴을 나머지가 0이면, 3)0 아니면 홀수라고 해라

 

그래서 3,

 

이렇게만 작성을 하고 실행하면

 6은 짝수입니다.

똑같이 값이 나오는 것을 확인할 있다. 

 

심지어 괄호 없이, 

 

result = '짝수' if num % 2 == 0 else '홀수'

 

이렇게도 있다.

헷갈릴 자신 있으면 쓰기.

 

2) for - 한방에 써버리기

 

a_list = [1, 3, 2, 5, 1, 2]

 

a_list 있는 값들에 전부 2 곱하려면 어떻게 해야할까.

 

먼저 그간 배운 것들을 활용해서 해본다면

아래와 같이 코드를 있을 것이다.

 

그럼 결과가 [2, 6, 4, 10, 2, 4] 이렇게 나올 거다.

 

이것도 줄로 줄여서 수가 있다.

 

b_list = [a*2 for a in a_list]

 

뒤에서부터 해석하자면, a_list 있는 a 돌리는데, 

그때 전부 2 곱하고, 마지막으로 [ ]리스트로 묶어라.

 

*참고*

b_list = [x*2 for x in a_list]  x 변수

 

그러면 아래와 같이 깔끔하게 코드를 있고

결과도 똑같이 [2, 6, 4, 10, 2, 4] 으로 나온다.

 

이렇게 축약해서 코드를 쓰는 선택사항이다.

때문에 헷갈리면 굳이 필요없다.

내가 보고 이해할 있으면 그걸로 ㅇㅋ.

 

 

2-7. map, filter, lambda

 

1) map - 리스트의 모든 원소를 조작하기

 

여기에서 쓰인 map

“people 하나하나 돌면서 check_adult 넣어라,

결과값을 다시 리스트로 묶어라.”

 

def check_adult(person):

    if person['age'] > 20:

        return '성인'

    else:

        return '청소년'

 

result = map(check_adult, people)

print(list(result))

 

이렇게 하고 결과값은

바로 강의에서 배운 듯이, 코드도 간단하게 있다.

 

return('성인' if person['age'] > 20 else '청소년')

 

여기서 lambda식을 사용해본다.

 

result = map(lambda x: x, people)

 

x 단순한 변수 이름이다. person 넣어도 무방.

다만, 지금은 코드에서 이미 person 썼으니 lambda 에도 person으로 넣어줘야 한다.

그러면 이렇게 길었던 코드가 세줄로 줄여진 것을 확인할 있다.

결과는 같다.

헷갈리지 않을 자신 있을 쓰면 되겠다.

 

2) filter - 리스트의 모든 원소 특별한 것만 뽑기

 

filter map 상당히 유사하지만,

true 값들만 불러온다는 점에서 차이가 있다.

(그리고 차이로 인해 훨씬 난이도가 낮다.)

 

이렇게 20 이상인 데이터만 뽑힌 것을 확인할 있다.

 

위의 lambda 식의 person x 써도 무방하다.

사실 관형적으로는 대부분 x라고 쓴다고 한다.

 

 

2-8. 함수 심화

 

1) 함수의 매개 변수

강의 내용은 직접 일이 많지는 않을 거지만

알고 있으면 라이브러리에서 가져다 쓰거나

도큐먼트를 읽는데 도움이 것이다.

 

def cal(a, b):

    return a + 2 * b

 

result = cal(1,2)

print(result)

 

그럼 2곱하기 2 더하기 1 이니까 결과는 5 나온다.

 

그런데 만약 a,b 하나를 고정시켜준다면

고정된 값은 굳이 안넣어줘도 것이다.

 

def cal(a, b=2):

 

이렇게 지정을 해준 다음

 

result = cal(1)

 

1 넣어주게 된다면, 값은 여전히 똑같은 5 나온다.

b 값을 넣어줘도 상관없다. 그럼 넣은 값으로 계산된 결과가 나온다.

 

result = cal(1,7)

 

15

 

그리고 이건 따라하지 말라고 했으나

기록을 위해 한번 해보기로 한다.

 

def cal(*args):

 

이렇게 args 입력해주면, 변수를 무제한으로 넣을수가 있다.

인수를 받는다고도 표현한다.

그걸 리스트로 받아서 수도 있다.

 

def cal(*args):

    for name in args:

        print(f'{name} 밥먹어라')

 

cal('철수','영희')

 

 

이렇게 넣어준다면, 

철수 밥먹어라

영희 밥먹어라

라고 결과가 나오는 것이 확인된다.

 

인수를 여러개 받을 수도 있다.

 

def get_kwargs(**kwargs):

    print(kwargs)

 

cal(name=‘bob’, age=30)

 

이렇게 **kwargs 쓰면

결과는 딕셔너리 형태로 출력된다.

 

{‘name’:‘bob’, ‘age’:30}

 

 

2-9. 클래스

 

우선, 클래스를 언제 사용하는지 생각해보시죠.

게임을 예로 들었을 몬스터 하나하나당 hp 중앙에서 관리할 수는 없을 것이다.

몬스터가 마리, 10만마리 이렇게 많다면 불가능할 .

따라서 몬스터마다 각자의 hp 가지게 해서 자체적으로 관리하도록 하는 편이 좋다.

 

실질적으로 클래스를 사용해보자.

 

class Monster():

    hp = 100

    alive = True

 

    def damage(self, attack):

        self.hp = self.hp - attack        hp attck만큼 줄어들거야,

                                                          근데 hp 쓰려면 self.hp 여기 self 붙여줘야 한다.

                                                          그래야 함수 안에서 hp=100 hp 가리킬 수가 있다.

        if self.hp < 0:                     

            self.alive = False           0보다 작으면 false

 

    def status_check(self):

        if self.alive == True:               == True 생략가능

            print('살았다')

        else:

            print('죽었다')                   

 

——————————————————편의상 이만큼 접어주고 아래 진행

 

m1 = Monster()               Monster 클래스 이름. m1,m2 인스턴스라고 말함

m1.damage(120)

m1.status_check()               100에서 120 빠지니까 0보다 작아짐, 죽었다고 출력된다.

 

m2 = Monster()                  

m2.damage(90)                    

m2.status_check()                100에서 90 빠지니까 아직 0보다 , 살았다고 출력된다.

 

이렇게 status 자체적으로 관리할 있다.