강의 복습 내용
- 파이썬 기본 자료구조 스택, 큐, 튜플, 집합, 사전
- 모듈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 CSV
extension을 추천 - 이쁘게 세로로 출력
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
- 수식 적는 마크다운