※ Overview
- Pythonic Code는 간단하게, 다른 사람의 코드를 잘 이해하기 위해서 파이썬 특유의 문법을 활용하여 효율적으로 코드를 표현하는 기법을 말합니다.
- 이번 챕터에서는 Pythonic Code를 작성하는 방법과, Matrices와 Vector의 연산을 Pythonic Code로 구현하는 방법을 배웁니다.
※ Split & Join
- Split & Join 을 사용하여 String Type의 값을 List 형태로 변환하고, List Type의 값을 String Type의 값으로 변환하는 Pythonic Code 작성법을 알아봅시다.
- items = 'zero,one,two,three'.split(',') # split안에 비우면 default는 ' '(공백)
(items = [zero, one, two, three]) # a, b, c, d = 'zero,one,two,three'.split(',')은 unpacking
result = '-'.join(items) # join앞에 ''로 두면 연달아 연결
(result = 'zero-one-who-three')
※ List Comprehension
- 일반적으로 for + append보다 속도가 빠릅니다.
- Nested For loop도 가능합니다.
ex) result = [ i+j for i in word_1 for j in word_2 ]
- Nested For loop와 if문(filter)을 함께 사용할 수도 있습니다.
ex) result = [ i+j for i in case_1 for j in case_2 if not(i==j) ]
- 2-dimensional list를 만들 때는 [ ]로 묶어줘야 합니다.
ex) stuff = [ [ w.upper(), w.lower(), len(w) ] for w in words ]
※ Enumerate & Zip
리스트의 값을 추출할때 함께 인덱스를 추출할 수 있는 방법으로 이용되는 enumerate 와 두개 이상의 list 값을 병렬적으로 추출할 수 있는 zip 모듈을 사용하여 pythonic code를 작성하는 방법을 알아봅니다.
- Enumerate는 List의 element를 추출할 때 번호를 붙여서 추출합니다.
ex) for i, v in enumerate( [ 'tic', 'tac', 'toe' ] ):
- Zip은 두 개의 list의 값을 병렬적으로 추출합니다.
ex) for a, b in zip(alist, blist):
- Zip을 list comprehension과 함께 사용할 수 있습니다.
ex) [ sum(x) for x in zip((1,2,3), (10,20,30), (100,200,300)) ] #튜플로 묶여서 x에 반환
- Enumerate와 Zip을 함께 사용할수도 있습니다.
ex) for i, (a, b) in enumerate(zip(alist, blist)):
※ Lambda & Map,Reduce
- 함수처럼 사용가능한 익명함수인 Lambda, Sequence 자료형의 데이터에서 함수를 적용하는 방법인 Map Function 과 Reduce Function 에 대해서 알아봅니다.
- Lambda는 함수 이름 없이, 함수처럼 쓸 수 있는 익명함수입니다.
ex) f = lambda x, y: x+y
print(f(1,4))
- Map function은 sequence자료형 각 element에 동일한 function을 적용합니다.
ex) list(map(f, ex, ex)) # map만 쓰면 map객체라 형변환을 해야 합니다.(or for문으로 접근)
- lambda함수의 filter에서 else를 반드시 적어줘야 합니다.
list(map(lambda x: x**2 if x%2==0 else x, ex))
- Reduce function은 map function과 달리 list에 똑같은 함수를 적용해서 통합합니다.
ex) from functools import reduce
print(reduce(lambda x, y: x+y, [1,2,3,4,5]))
※ Asterisk(*)
- *는 덧셈 곱셈뿐만 아니라 가변 인자 활용에도 활용됩니다.
ex) def asterisk_test(a, *args): # 처음값뺴고 나머지가 tuple형태로 args에 할당됩니다.
asterick_test(1,2,3,4,5,6)
- **이 함수에서 dict타입으로 들어가게 해주기도 합니다.
ex) def asterick_test(a, **kargs):
asterick_test(1,b=2,c=3,d=4,e=5,f=6) # kargs = { 'b':2, 'c':3', 'd':4, 'e':5, 'f':6 }
- *이 tuple,dict 등 자료형 앞에 들어가있으면 unpacking한 상태가 됩니다.
ex) def asterick_test(a, args):
asterisk_test(1,*(2,3,4,5,6))
※ (참고) Data Structure - Collections
- tuple, dict 에 대한 확장 데이터 구조를 제공하는 Collections 안에 포함된 모듈을 이용하여 Data Sturcture 의 기본개념을 이해하고 사용하는 방법을 알아봅니다.
- deque는 Stack과 Queue를 지원하는 모듈입니다. rotate, reverse등 Linked List의 특성을 지원하고, 기존 list 형태의 함수를 모두 지원합니다.
- OrderedDict는 Dict와 달리, 데이터를 입력한 순서대로 dict를 반환합니다. Dict type의 값을, value 또는 key값으로 정렬할 때 사용 가능합니다.
- defaultdict는 Dict type의 값에 기본 값을 지정합니다.
- Counter는 Sequence type의 data element들의 갯수를 dict형태로 반환합니다. Dict type, keyword parameter 등도 모두 처리가능합니다.
※ Linear algebra codes
- Vector를 파이썬으로 표시하는 다양한 방법이 존재하고, 최선의 방법은 없습니다. 본 수업에서는 기본적으로 list로 vector 연산을 실시합니다.
ex) [5 * sum(z) for z in zip(u,v)]
- Matrix 역시 Python으로 표시하는 다양한 방법이 존재합니다. 본 수업에서는 기본적으로 two-dimensional list 형태로 표현합니다.
ex) result = [ [ sum(row) for row in zip(*t) ] for t in zip(matrix_a, matrix_b) ] (행렬덧셈)
result = [ [ element for element in t] for t in zip(*matrix_a) ] (행렬전치)
result = [ [ sum(a*b for a,b in zip(row_a, column_b)) for column_b in zip(*matrix_b) ] for row_a in matrix_a ] (행렬곱셈)
※ Case Study - News Categorization
- 이번에는 지금까지 배운 List Comprehension, Data Structure(Collections), Pythonic Code 작성법 등을 기반으로 다른 패키지 사용 없이 Python만을 이용하여 한 뉴스에 대해 비슷한 뉴스를 찾아내도록 작성된 코드를 실행합니다.