강의 복습 내용

  • 파이썬 기본 자료구조 스택, 큐, 튜플, 집합, 사전
  • 모듈collection
  • pythonic code
    • split,join,list comprehension,enumerate,zip
  • lambda, map, reduce
  • iterator, generator
  • function passing arguments, asterisk(*)

얻은 지식

  • 기초적인 파이썬의 자료구조와 사용방식을 배움
  • 리스트를 조작하는 함수를 공부할 수 있었음
  • 어렵지는 않지만 아직 눈과 손에 익지 않아서 햇갈림
  • 점차 손에 익혀야할 함수와 코드 스타일

자료구조

스택

  • LIFO(Last In First Out)
  •   #list를 이용해 구현 가능
      a = [1,2,3,4]
      #push는 append로 데이터 입력
      a.append(5)
      #pop은 pop으로 데이터 출력
      a.pop()
    

  • FIFO(First In First Out)
  •   #list를 이용해 구현 가능
      a = [1,2,3,4]
      #put은 append로 데이터 입력
      a.append(5)
      #get은 pop(0)으로 데이터 출력
      a.pop(0)
    

튜플

  • 값의 변경이 불가능한 리스트
  • 리스트 함수는 사용가능
  • 선언은 []가 아닌 ()로 한다.
  • (1,)값이 하나인 튜플 선언시

집합

  • 중복이 없는 자료구조
  •   s=set([1,2,3,1,2,2,1])
      #s = {1,2,3}
      s.add(1) # 원소 추가
      s.update([1,3,4,5,6])# 여러 요소 추가
    
      s.remove(1) # 1이라는 요소 삭제
      s.discard(3) # 3이라는 요소 삭제 
      #remove와 차이는 지우려는 요소가 없을때 에러가 안남
      s.clear() #전체 삭제
    
  • 수학시간에 배운 합집합,교집합, 차집합을 지원해준다.
  •   #합집합
      s1.union(s2)
      s1|s2
      # 교집합  
      s1.intersection(s2)
      s1&s2
      # 차집합
      s1.difference(s2)
      s1-s2
    

dictionary 사전

  • hash/map과 유사한 역할을 하는 자료구조
  • key와 value를 관리
  •   #dict생성
      c = {}
      c = dict()
      # key value형식으로 출력 for in으로 하나씩 출력가능
      c.itmes()
      # key만
      c.keys()
      # value만 
      c.values()
      # 추가
      c["key2"]=49
    

collection 모듈

  • list, tuple, dict에 대한 python built-in확장 자료 구조 모듈
  • 좀더 사용하기 쉽다.

  • deque
    • stack과 queue를 지원
    • list에 비해 효율적이고 속도도 향상된다.
    • rotate, reverse등 linked list의 특성을 지원
    •   from collection import deque
        dequeu_list = deque()
        #추가
        dequeu.append(1) 
        dequeu.appendleft(2)
        dequeu.extend([]) 
        dequeu.extendleft([])
        #회전 숫자만큼 시계방향으로 돌려준다, 음수면 왼쪽으로
        dequeu.rotate(1)
      
      
  • orderedDict
    • 입력한 순서대로 dict를 반환(3.6부터는 dict도 보장)
  • defaultdict
    • 빈값에 대해 기본 값을 지정해준다.
    •   from collection import defaultdict
        d = defaultdict(lambda : 0) # 기본 값 설정
      
  • Counter
    • sequence type의 데이터 요소들의 갯수를 dict형태로 반환(복잡…)
    •   from collection import Counter
        v = ["b","b","b","b","b","c","c","c"]
        c = Counter(v) 
        #Counter({'b':5,"s":3}) 각 요소별로 key, 갯수를 value인 dict로 반환
        c = Counter("string")# 문자열도 가능
      
    • set연산도 가능
    • 공백기준으로 나뉜 문자 갯수를 셀때 유용하다.
  • namedtuple
    • tuple형태로 data구조체를 저장
    •   from collection import namedtuple
        #Point라는 튜플에 x와 y값이 있다고 사전에 정의
        Point = namedtuple('Point',['x','y'])
        p = Point(11, 22) #x는 11,y는 22가 들어간다. 
        p.x # 11
        p.y # 12
        e,t = p
        e #11
        t #12
      

pythonic code

  • 파이썬 스타일의 코딩 기법
  • 파이썬 특유의 문법으로 효율적인 코드작성
  • 파이썬만의 문법이 아니라고 함

split, join

  • 어떻게 자르고, 합칠지
  • join list를 결합할때 사용한다. 중간 문자를 지정할 수 있다.
    •     '중간마다 들어가는 문자'.join(결합할 list)
      

list comprehension

  • 기존 list로 다른 list를 만드는 기법
  • 가장 많이 사용된다.
  • for + append보다 빠르다고 한다.
  • #0부터 9까지의 배열 생성
    result = [i for i in range(10)] 
    
    # 필터를 통해 짝수만 가능
    result = [i for i in range(10) if i%2 == 0] 
    
    #2중 배열도 가능하다
    result = [i+j for i in word1 for j in word2]
    #for i in word1:
    #  for j in word2:
    #    result.append(i+j)
    #이것과 같은 효과를 가진다.
    
    # 필터 적용 가능
    result = [i+j for i in word1 for j in word2 if i==j]
    
    #이차원 배열 형식으로 출력도 가능
    result = [[w.upper(),w.lower(),len(w)]for w in words]
    
    #j부분부터 먼저 작동, 내부의 i가 다음 작동하여 이차원배열로 작성됨
    result = [[i+j for i in word1] for j in word2]
    #for j in word2:
    #  l = []
    #  for i in word1:
    #    l.append(i+j)
    #  result.append(l)
    

enumerate

  • list의 요소를 추출할때 번호를 붙여줌
  •   for i,v in enumerate(['a','b','c']):
          print(i,v)
          # 0 a
          # 1 b
          # 2 c
      list(enumerate(['a','b','c']))
      # [(0,'a'),(1,'b'),(2,'c')] #새로운 튜플로 이뤄진 리스트로 바꿀수 있다.
    

zip

  • 두개이상의 list,tuple의 값을 병렬적으로 추출할때
  • 두개의 리스트길이가 다르면 작은거 기준으로 만들어준다.
  •   a=[1,2,3,4]
      b=['a','b','c','d']
      for i,j in zip(a,b):
          #i는 a[0] j는 b[0]
          #i는 a[1] j는 b[1]
          # ... 병렬적으로 출력해준다.
        
        
      #list comprehension로 표현도 된다.
      [i for i in zip((1,2,3),(4,5,6),(11,12,13))]
      #[(1,4,11),(2,5,12),(3,6,13)]
    

lambda,map,reduce

  • 간단한 코드
  • 직관성이 떨어져서 python3는 권장하지 않음
  • legacy나 머신러닝에서는 사용됨

lambda

  • 함수 이름 없이, 함수처럼 쓸 수 있는 익명 함수
    • f = lambda 입력파라매터 : 반환값
    • f = lambda x,y: x+y
  • python3부턴 권장하진 않지만 많이 쓰임
    • f = lambda x:2*x 보다는 def f(x):return 2*x를 권장
    • 어려운문법
    • 테스트의 어려움
    • 문서화 docstring미비
    • 코드 해석의 어려움
    • 이름이 존재하지 않는 함수

map

  • list의 각 요소를 돌면서 새로운 list를 새로 만드는 함수
  • 함수를 정의하고(lambda를 자주 사용하는듯), 이 함수를 list의 요소마다 적용하여 새로운 list를 반환한다.
  • map(함수,list1,...)
  •   f = lambda x:x+7
      l = [1,2,3,4]
      list(map(f,l))# f함수를 l에 적용한다는 의미
      #[8,9,10,11]로 출력
        
      f2 = lambda x,y:x+y
      list(map(f2,l,l))
      #이게 입력이 x,y가 들어가야함, y자리를 특정 숫자로 넣으면 오류가난다.
      # 입력 두개다 iterable한 list여야 한다.
      # 두 입력이 순차적으로 같은 index에 대해 계산을 한다.
    
      # if filter 적용시
      f3 = lambda x :x+2 if x%2==0 else x #else까지 해줘야 잘 작동한다.
      list(map(f3,l)) 
    
    

reduce

  • map과 달리 통합해준다.
  • from functools import reduce를 선언해줘야 한다.
  •   from functools import reduce
        
      reduce(lambda x,y:x+y,[1,2,3,4,5])
      # x에 가중되어서 넘어가고, y가 요소를 하나씩 가져온다.
      # 결과는 15
    

iterable object

  • sequence형 자료형에서 데이터를 순서대로 추출하는 object
  •   l = ["a","b","c"]# iterable 객체
      i_o = iter(l)# iterator object로 변환
      next(i_o)#next를 통해 하나씩 가져온다.
    

generator

  • iterable object를 특수한 형태로 사용
  • 요소가 사용되는 시점에 값을 메모리 반환
    • 좀더 메모리를 아낄수 있어 대용량일때 유용하다.
  • yield를 이용해 한번에 하나의 요소만 반환
  • generator comprehension은 ()로 표현한다.
  • 언제 쓸지
    • 중간에 loop가 중단될 수 있으면
    • 빅 데이터
    • 파일데이터 처리시
  • 
      # 일반적인 일정 범위만큼의 list를 만들기
      #0부터 v까지를 list로 만들기
      def make_list(v):
          result = []
          for i in range(value):
              result.append(i)
          return result
        
    
      # 아래처럼 yield를 사용한다.
      def generator_list(v):
          for i in range(value):
              yield i
    
      # for로 출력도 가능하다
      for i in generator_list(20):
          print(i)
          # print해야 한다고 하면 generator_list가 한번에 만드는게 아니라
          # yield로부터 값을 하나씩 받아온다.
          # 메모리 절약이 가능하다고 한다.
    
      #그냥 list로 감싸도 된다.
      list(generator_list(10)) 
    
      #next로 하나씩 가능하다
      ge_e = generator_list(100)
      next(ge_e)# 0
      next(ge_e)# 1
    
      #형태를 변형해서 중간중간 처리과정을 표현도 가능하다.
      def gen_exx():
          n=1
          print("시작")
          yield n
    
          n+=1
          print("중간")
          yield n
    
          n+=1
          print("끝")
          yield n
      # 위처럼 for로 출력하거나, list로 감싸거나, next로 하나씩 출력하는게 가능하다.
    
    
      #generator comprehension
      gen_ex = (n*n for n in range(600))
      #gne_ex도 for나 list로 감싸면 된다.
    

function passing arguments

  • 함수에 입력되는 arguments의 다양한 형태

passing arguments

  • 함수 사용시 파라매터 이름을 지정이 가능하다.
  •   def f(a,b):
          ...
      f(b="aa",a="bb")
    

default arguments

  • 파라매터에 기본값을 지정
  •   def f(a,b="bb"):
          ...
      f("aa") # b를 입력하지 않아도 알아서 bb로 기본값이 입력
    

variable-length arguments

  • 가변길이 arguments
  • 개수가 정해지지 않은 변수를 함수의 parameter로 사용
  • asterisk(*) 별 표 기호를 사용한다.
  • 입력된 값은 tuple
  • 가변인자는 오직 한개로 마지막 parameter위치에 사용가능
  •   def f(a,*b):
          ...
      f("aa",1,2,3,4) # b=(1,2,3,4) 튜플형식
    

keyword variable-length

  • parameter이름을 따로 지정하지 않고 입력
  • asterisk(*) 별 표 기호 두개를 사용한다.
  • 입력된 값은 dict type
  •   def f(**b):
          ...
      f(a=1,b=2) # {'a':1,'b':2} dict형식으로 함수에 전달
    

합쳐서 가능

  •   def f(a,b=3,*args,**kwargs):
          ...
      f(1,2,3,4,5,d=6,e=7)
      f(1,b=2,3,4,5,d=6,e=7)
      f(1,2,d=6,e=7)
      f(a=1,b=2,3,4,5,d=6,e=7)#에러난다. 
          #a=1이 a에 1을 넣는게 아닌, **키워드로 분류되기때문
    

asterisk

  • tuple, dict 등 값을 unpacking할때
  •   def f(a,*args):
          ...
      f(1,*(2,3,4,5))# (2,3,4,5)=>2,3,4,5로 값이 풀린상태로 들어간다.
    
      def f(a,args):
          #*args로 데이터를 풀어서 사용
          ...
      f(1,(2,3,4,5))
    
      #zip에서 유용하게 사용
      z = ([1,2],[3,4],[5,6])  # 여러 리스트를 가진 튜플
      a,b,c = z # 다시 또다른 변수에 넣어야한다.
      for v in zip(a,b,c):
          print(v)
      for v in zip(*z): # *를 이용해 z를 바로 풀어서 사용하면 된다.
          print(v)
    
        
    
    

기타 팁

  • csv는 rainbow CSVextension을 추천
  • 이쁘게 세로로 출력
    • python import pprint pprint.pprint(출력할거)
  • 유닛테스트 추가 정보
    • self.assertEqual(1222,target_number)로 중간에서 값 확인할때 사용

피어세션 정리

  • 과제 각자 후기
    • 디버깅
      • self.assertEqual()
    • mock같은 가끔쓰는 모듈은 가상환경을 만들어 새로운 pip설치하기
      • virtualenv myvenv
      • soure myvenv/bin/activate
  • JNI
    • JVM으로 처리가 못할때 JAVA가아닌 운영체제 언어로 구현하는거 정도
  • 딥러닝 / 머신러닝 차이
    • 머신러닝 안에 딥러닝이 있다.
      • 딥 - 레이어가 딥하다
  • awsome devblog
    • 개발 관련 정보
  • tensorflow / pytorch
    • pytorch모델 지원이 좀더 좋다.
    • 파이썬 코딩에 좀도 좋다는 의견
  • teachablemachine
    • model을 따로 추출할 수 있다.
  • katex
    • 수식 적는 마크다운