코딩하는 해맑은 거북이
인공지능(AI) 기초 다지기 (3) 본문
본 게시물의 내용은 '인공지능(AI) 기초 다지기(부스트코스)' 강의를 듣고 작성하였다.
해당 글은 1-3. 파이썬 기초 문법 Ⅱ 2가지 파트를 다룬다.
1. Python Data Structure
2. Pythonic code
1. Python Data Structure
- Stack, 스택 : Last in First Out (LIFO)
리스트를 사용하여 스택 구조 구현 가능
Data의 입력 : push - append()
Data의 출력 : pop - pop()
- Queue, 큐 : First in First Out (FIFO)
리스트를 사용하여 큐 구조 활용
Data의 입력 : push, put - append()
Data의 출력 : pop, get - pop(0)
- Tuple, 튜플
값이 변경이 불가능한 리스트, 선언시 "( )"를 사용
리스트의 연산, 인덱싱, 슬라이싱 등을 동일하게 사용, But, 변경만 안된다!
쓰는 이유 : 프로그램을 작동하는 동안 변경되지 않는 데이터의 저장을 위해, 즉 함수의 반환값 등 사용자의 실수에 의한 에러를 사전에 방지하기 위함.
- Set, 집합
값을 순서없이 저장하고, 중복 불허하는 자료형
set() 함수로 객체 선언을 이용하거나 "{ }"로 객체 생성
Data의 추가 : add(), update()
Date의 삭제 : remove(), discard(), clear()
* 수학에서 활용하는 다양한 집합연산 가능
합집합 : s1.union(s2), s1 | s2
교집합 : s1.intersection(s2), s1 & s2
차집합 : s1.difference(s2), s1 - s2
- Dictionary, dict, 사전
데이터를 저장할 때 구분 지을 수 있는 값을 함께 저장하는 구조
Key 값을 활용하여 데이터 값(Value)를 관리함 → key와 value를 매칭하여 key로 value를 검색
dict() 함수로 객체 선언을 이용하거나 "{ k:v }"로 객체 생성
구조 : {k1:v1, k2:v2, k3:v3, ..}
cf) 다른 언어에서는 Hash Table이라는 용어를 사용한다
Data의 출력 : dict.items()
Data의 key값만 출력 : dict.keys()
Data의 value값만 출력 : dict.values()
Date의 추가 : dict[key]=value, update()
Date의 삭제 : pop(), popitem(), clear()
- Collection 모듈 5가지 : from collections import ___
: List, Tuple, Dict에 대한 Python Built-in 확장 자료 구조(모듈) / 편의정, 실행효율 등을 사용자에게 제공함
(1) deque (데큐)
Stack과 Queue를 지원하는 모듈, List에 비해 빠른 자료 저장 방식을 지원한다. → 효율적 메모리 구조로 처리 속도 향상
rotate, reverse 등 Linked List의 특성을 지원함 / 기존 list 형태의 함수를 모두 지원함
객체 선언 : deque()
rotate 방식으로 리스트 n칸씩 이동 : deque_list.rotate(n)
Data의 추가 : append(), appendleft(), extend(리스트), extendleft(리스트)
Data의 삭제 : pop(), popleft() 등등
(2) OrderedDict 》 예전에 이런것도 있었다 정도로 생각하면 됨
Dict와 달리, 데이터를 입력한 순서대로 dict를 반환함.
But, dict도 python 3.6 부터 입력한 순서를 보장하여 출력함
(3) defaultdict
Dict type의 값에 기본값을 지정, 신규값 생성시 사용하는 방법
ex) d = defaultdict(lambda: 0) # Default 값을 0으로 설정함
(4) Counter
Sequence type의 Data element들의 갯수를 dict 형태로 반환
elements() 함수를 통해 리스트 형태로 다시 반환 가능
substract() 함수를 통해 counter 객체끼지 빼줄 수 있음
set의 연산들을 지원함
(5) namedtuple
Tuple 형태로 Data 구조체를 저장하는 방법
저장되는 data의 variable을 사전에 지정해서 저장함
2. Pythonic code, 파이썬 스타일 코드
- split 함수
string type의 값을 "기준값"으로 나눠서 List 형태로 변환
ex) 문자열.split(기준값)
- join 함수
string으로 구성된 list를 합쳐 하나의 string으로 반환
ex) 연결문자열.join(리스트)
- list comprehension
기존 List를 사용하여 간단히 다른 List를 만드는 기법
포괄적인 List, 포함되는 리스트라는 의미로 사용됨.
일반적으로 for+append 보다 속도가 빠름
*pprint : 리스트를 한 행씩 깔끔하게 출력하기 위해 사용함!
- enumerate & zip
enumerate : list의 element를 추출할 때 번호를 붙여서 추출
zip : 두 개의 list의 값을 병렬적으로 추출함
* enumerate & zip 동시 사용 용례
- lambda & map & reduce
간단한 코드로 다양한 기능을 제공한다.
그러나 코드의 직관성이 떨어져서 lambda나 reduce는 python3에서 사용을 권장하지 않음
Legacy library나 다양한 머신러닝 코드에서 여전히 사용중
lambda : 함수 이름 없이, 함수처럼 쓸 수 있는 익명 함수
cf) PEP 8에서는 lambda의 사용을 권장하지 않음
* lambda problems
어려운 문법
테스트의 어려움
문서화 docstring 지원 미비
코드 해석의 어려움
이름이 존재하지 않는 함수의 출현
그래도 많이 쓴다
map : 두 개 이상의 list에도 적용 가능함, if filter도 사용가능
실행 시점의 값을 생성, 메모리 효율적!
그러나, 사용자가 알아보기 어렵기 때문에 map보다 list comprehension 형태로 표현하는 것을 권장함
reduce : map function과 달리 list에 똑같은 함수를 적용해서 통합
대용량의 데이터를 다룰 때 많이 사용한다.
- iterable object
Sequence형 자료형에서 데이터를 순서대로 추출하는 object
내부적 구현으로 __iter__와 __next__가 사용됨
iter() 와 next() 함수로 iterable 객체를 iterator object로 사용
- generator
iterable object를 특수한 형태로 사용해주는 함수
element가 사용되는 시점에 값을 메모리에 반환함. 즉. 메모리 주소를 절약할 수 있음
→ yield를 사용해 한번에 하나의 element만 반환함
list comprehension과 유사한 형태로 generator형태의 list 생성
generator expression 이라는 이름으로도 부름
[ ] 대신 ( ) 를 사용하여 표현
일반적인 iterator는 generator에 반해 훨씬 큰 메모리 용량 사용
* 언제 사용하는가?
- list 타입의 데이터를 반환해주는 함수는 generator로 만들어라!
: 읽기 쉬운 장점, 중간 과정에서 loop이 중단될 수 있을 때
- 큰 데이터를 처리할 때는 generator expression을 고려하라
: 데이터가 커도 처리의 어려움이 없음
- 파일 데이터를 처리할 때도 generator를 쓰자
- Function passing arguments
1) Keyword arguments
함수에 입력되는 parameter의 변수명을 사용, arguments를 넘김
2) Default arguments
parameter의 기본 값을 사용, 입력하지 않은 경우 기본값 출력
3) Variable-length asterisk
* 가변인자 (Variable-length)
- 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법
- Asterisk(*) 기호를 사용하여 함수의 parameter를 표시함
- 입력된 값은 tuple type으로 사용할 수 있음
- 가변인자는 오직 한 개만 맨 마지막 parameter 위치에 사용가능
- 가변인자는 일반적으로 *args를 변수명으로 사용
* 키워드 가변인자 (Keyword variable-length)
- parameter 이름을 따로 지정하지 않고 입력하는 방법
- asterisk(*) 두개를 사용하여 함수의 parameter를 표시함
- 입력된 값은 dict type으로 사용할 수 있음
- 가변인자는 오직 한 개만 기존 가변인자 다음에 사용
ex) 예제
cf) 앞부분을 keyword arguments 형태로 넣어주면, 뒷부분도 keyword arguments 형태로 넣어줘야한다!
뒷부분만 keyword arguments 형태로 넣어주는 것도 가능하다.
* asterisk
흔히 알고 있는 * 를 의미함.
단순 곱셈 : * / 제곱 연산 : ** / 가변인자 활용 등에 다양하게 사용됨
또한, unpacking a container 로도 활용된다!
→ tuple, dict 등 자료형에 들어가 잇는 값을 unpacking
→ 함수의 입력값, zip 등에 유용하게 사용가능
'AI' 카테고리의 다른 글
인공지능(AI) 기초 다지기 (5) (0) | 2022.12.18 |
---|---|
인공지능(AI) 기초 다지기 (4) (0) | 2022.12.17 |
인공지능(AI) 기초 다지기 (2) (0) | 2022.12.12 |
인공지능(AI) 기초 다지기 (1) (0) | 2022.12.12 |
[딥러닝] Normalization, Standardization (0) | 2022.08.03 |