배우고 느끼고 생각하고 사랑하라

그리고 즐겨라

정리/부캠-1

[부스트캠프 AI Tech] Day 2

gyubinc 2023. 3. 12. 17:24

3)파이썬 기초문법 2


3-1) Python Data Structure


파이썬 기본 데이터 구조

  • 스택과 큐(stack & queue with list)

  • 튜플과 집합(tuple & set)

  • 사전(dictionary)

  • Collection모듈

스택

  • 나중에 넣은 데이터를 먼저 반환(LIFO)

  • 입력을 Push, 출력을 Pop이라고 함

  • 먼저 넣은 데이터를 먼저 반환(FIFO)

  • Stack과 반대

튜플

  • 값의 변경이 불가능한 리스트

  • 리스트의 연산, 인덱싱, 슬라이싱 등을 동일하게 사용

  • 프로그램 작동 동안 변경되지 않는 데이터의 저장

Set

  • 값을 순서없이 저장, 중복 불허

Dictionary

  • 데이터 저장 시 구분지을 값과 함께 저장

  • 구분을 위한 데이터 고유 값을 Identifier 도는 Key라고 함

  • Key 값을 활용하여, 데이터 값(Value)를 관리

  • 다른 언어에서는 Hash Table이라는 용어 사용

Collections

  • List, Tuple, Dict에 대한 Python Built-in 확장 자료 구조(모듈)

  • deque, Counter, OrderedDict, defaultdict, namedtuple 등의 모듈 존재

  • 빠른 속도

가상환경 생성

Conda create -n gyubin python

가상환경 활성화

Conda activate gyubin

3-2) Pythonic code


Pythonic code

  • 파이썬 스타일의 코딩 기법

  • 파이썬 특유의 문법, 효율적 코드

  • 남 코드에 대한 이해도

  • for, loop, append보다 list가 조금 더 빠르다.

  • 간지

종류

1)split & join

String type의 값을 ‘기준값’으로 나눠서 List형태로 변환

text = ‘hello I’m gyubin’.split()
print(text)
#reulst : [‘hello’, ‘I’m’, ‘gyubin’]

2)list comprehension

기존 List 사용하여 간단히 다른 List 만드는 기법

  • 파이썬에서 가장 많이 사용

  • for + append보다 빠르다

#원래 방식
result = []
for i in range(10):
    result.append(i)

#comprehension
result = [i for i in range(10)]

이러한 방식도 가능

#원래 방식
A = ‘abc’
B = ‘def’
result = []
for i in A:
    For j in B:
        result.append(i+j)

#comprehension
A = ‘abc’
B = ‘def’
result = [i+j for i in A for j in B]
#result : [‘ad’, ‘ae’, ‘af’, ‘be’, ‘be’…….

+뒤에 if문 넣으면 filter역할 가능

3)enumerate & zip

Enumerate

list의 element를 추출할 때 번호를 붙여서 추출

For i, v in enumerate([‘a’, ‘b’, ‘c’]):
Print(i, v)
#i = index, v = value

Zip

두 개의 list의 값을 병적으로 추출

A = [‘a’, ‘b’, ‘c’]
B = [‘d’, ‘e’, ‘f’]

[c for c in zip(A,B)]
#[(‘a’, ‘d’), (‘b’, ‘e’), (‘c’, ‘f’)]

4)lambda & map & reduce

Lambda

함수 이름 없이, 함수처럼 쓸 수 있는 익명함수

  • 요즘은 권장하지는 않으나 많이 씀 (해석, 테스트가 어려움)
  • f = lambda x,y : x+y
    f(10,50)
    

#다른 방식
(lambda x,y : x+y)(10,50)


**Map**

두 개 이상의 list에도 적용 가능함, if filter도 사용 가능
```python
A = [1,2,3]
f = lambda x,y : x+y
print(list(map(f, A, A)

#result : 2 4 6

Reduce

from functools import reduce
print(reduce(lambda x, y : x+y, [1,2,3,4,5]

#과정 : 3, 6, 10, 15 출력 : 15

5)generator

큰 데이터를 처리할 때 generator expression을 고려
파일 데이터 처리 시 권장

Iterable object

내부적 구현으로 iternext 사용

A = [1,2,3,4,5]
Next_text = iter(A)
next(Next_text)

#하나씩 밖으로 나옴
#yield를 통해 제네레이터를 만들면 필요할 때마다 호출해 메모리 효율적 활용 가능

Generator comprehension

list_gen = (I * I for I in range(500))
#list(list_gen)
#for i in List_gen과 같이 활용

6)function passing arguments

keyword arguments

함수에 입력되는 parameter의 변수명을 사용

def func(a,b):
    pass
func(b = ‘hi’, a = ‘bye’)
#위와 같이 넣으면 a, b를 각각 찾아서 들어감

default arguments

parameter의 기본값을 사용, 입력하지 않아도 기본값 출력

def func(a, b = ‘bye’):
    pass
func(‘hi’)
#위와 같이 넣으면 b를 넣지 않아도 b 값에 ‘bye’ 입력

variable-length arguments(가변 인자)

Asterisk(*) 기호를 사용해 parameter 표시

  • 가변인자는 오직 한 개만

  • args 변수명 주로 사용

  • tuple 형태로 저장

def asterisk_func(a, b, *args):
    print(a, b, sum(args)

asterisk_func(1,2,3,4,5)

keyword variable-length(키워드 가변인자)

asterisk(*) 2개 사용해서 표시

  • dict type으로 사용
def func(**kwargs):
    print(kwargs)

func(a = 1, b = 2, c = 3)

#result : {‘a’ = 1, ‘b’ = 2, ‘c’ = 3}

asterisk-unpacking a container

tuple, dict 등 자료형의 값을 unpacking해서 입력

  • zip 과 활용하면 강력
    func(1,*(2,3,4,5,6))
    

#func(1,2,3,4,5,6)으로 처리됨

```python
A = ([1,2], [3,4], [5,6], [7,8])
for x in zip(*A):
    print(x)

#result : (1,3,5,7) (2,4,6,8)

4) 파이썬 객체 지향 프로그래밍


4-1) Python Object Oriented Programming


OOP

  • 객체 : ‘속성(Attribute)’와 ‘행동(Action)’을 가짐

  • 속성 = 변수(variable), 행동 = 함수(method)

예시

class Player(object):
    def __init__(self, name, position, back_number):
        self.name = name
        self.position = position
        self.back_number = back_number

    def change_back_number(self, new_number):
        print(f'선수의 등번호를 변경합니다 : From {self.back_number} to {new_number}')
        self.back_number = new_number

if __name__ == "__main__":
    gyubin = Player('gyubinc', 'striker', 13)

    print(gyubin.back_number)
    print('-'*30)
    gyubin.change_back_number(20)
    print('-'*30)
    print(gyubin.back_number)

Python naming rule
변수,함수명 짓는 방식

  • snake_cas : 띄어쓰기 부분에 ‘_’를 추가해 뱀처럼 표현, 파이썬 함수, 변수명

  • CamelCase: 띄어쓰기 부분에 대문자를 사용해 낙타의 등처럼 표현, 파이썬 Class명

매직 메소드

__init__

  • 객체에 대한 정보 선언

__str__

  • print문 사용 시 return의 값이 출력됨

__add__

  • 두 인스턴스를 더할 시 동작
    class Player(object):
      def __init__(self, name, position, back_number):
          self.name = name
          self.position = position
          self.back_number = back_number
      def __str__(self):
          return ‘this is player’
      def __add__(self,other):
          return self.name + other.name

주의점

  • method(Action) 추가시 반드시 self를 추가해야 한다.

  • Self = 생성된 instance 자신

OOP 특성

  • 객체 지향 언어의 특징 = 실제 세상을 컴퓨터 속에 모델링

  • Inheritance(상속), Polymorphism(다형성), Visibility(가시성)

상속(Inheritance)

부모클래스의 속성을 자식 클래스가 내려받아서 사용하는 것

class Person(object):
    def __init__(self, name, age):
        pass
class Korean(Person):
    def __init__(self, name, age, gender):
        super().__init__(name, age, gender)
        self.gender = gender
    def about_me(self):
        super().about_me()
        print(“plus alpha”)

다형성(Polymorphism)

같은 이름 메소드의 내부 로직을 다르게 작성할 때
함수명은 같지만 코드 내부는 조금씩 다른 경우 (도형별 넓이 구하는 공식)

가시성(Visibility)

객체의 정보를 볼 수 있는 권한 조절

캡슐화(Encapsulation) 또는 정보 은닉(Information Hiding)

  • 클래스 간 간섭/정보공유의 최소화

  • ‘slef.__변수명’의 형태로 구현(mangling이 일어나 숨겨짐)

  • @property를 사용 시 반환 가능

First – class objects

  • 일급 객체

  • 변수나 데이터 구조에 할당 가능한 객체

  • 파이썬의 모든 함수는 일급함수

Inner function

  • 내재함수, 함수 안에 함수를 정의

데코레이터 function

  • 데코레이터를 쓰면 해당 함수를 데코레이터 함수에 입력된다

  • 인자값을 데코레이터 함수에 적어 놓으면 내부 함수에 입력된다

def happy(func):
    def inner(*args):
        print('hi')
        func(*args)
        print('bye')
    return inner

@happy
def printer(txt):
    print(txt)

printer("Im gyubin")
‘’’
result : hi
Im gyubin
Bye
‘’’

4-2) Module & Project


모듈

  • 어떤 대상의 부분 혹은 조각

  • 패키지

  • 모듈을 모아놓은 단위, 하나의 프로그램

  • Module == py 파일을 의미

  • 같은 폴더에 Module에 해당하는 py있으면 import로 호출 가능

Namespace

모듈 호출 범위

  • from과 import 키워드를 사용

  • 필요한 내용만 골라서 호출

  • Alias 설정하기 – 모듈명을 별칭으로 (import ~~ as ~)

  • 특정 함수 또는 클래스만 호출 (from ~~ import ~)

  • 모듈에서 모든 함수, 클래스 호출 (from ~~ import *)

Built-in Module

  • 내장함수

패키지

코드의 묶음

  • 다양한 모듈들의 합, 폴더로 연결

  • __init__, __main__ 등의 이름으로 만든다

패키지 만드는 연습

'''
miniconda 들어가서 각 폴더, python 파일 만들기
모든 폴더는 __init__.py 폴더를 만든다
Bgm 폴더에다가 아래 함수 작성
'''

def bgm():
    return ‘hi’

'''
Miniconda 실행 - game폴더에서 python 실행 – from sound import bgm – bgm.bgm()
'''

가상환경

필요한 패키지만 설치하는 환경

  • 기본 인터프리터 + 프로젝트 종류별 패키지 설치

  • 다양한 패키지 관리도구(virtualenv / conda)

  • Virtualenv + pip = 대표적, 레퍼런스 많음

  • Conda =설치 용이, Windows 장점

Miniconda 패키지 설치 방법

conda install tqdm
onda install jupyter

'정리 > 부캠-1' 카테고리의 다른 글

[부스트캠프 AI Tech] Day 5  (1) 2023.03.12
[부스트캠프 AI Tech] Day 4  (0) 2023.03.12
[부스트캠프 AI Tech] Day 3  (0) 2023.03.12
[부스트캠프 AI Tech] Day 1  (0) 2023.03.12