코딩하는 해맑은 거북이

인공지능(AI) 기초 다지기 (3) 본문

AI

인공지능(AI) 기초 다지기 (3)

#CJE 2022. 12. 13.
본 게시물의 내용은 '인공지능(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 보다 속도가 빠름

2중 for문 모양!

*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만 반환함

value = 50,  1) 총 바이트 수 : 520   /    2) 총 바이트 수 : 112

list comprehension과 유사한 형태로 generator형태의 list 생성

generator expression 이라는 이름으로도 부름

[ ] 대신 ( ) 를 사용하여 표현

일반적인 iterator는 generator에 반해 훨씬 큰 메모리 용량 사용

순서대로 112 / 4568 / 4246 print

 

* 언제 사용하는가?

- 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 등에 유용하게 사용가능

argument에 *( )를 하면 unpacking된 형태로 parameter에 전달된다

Comments