[Day 3]

Dongbin Lee·2021년 1월 20일
0

2021부캠AI

목록 보기
1/24

2021 부스트캠프 Day 3

[Day 3] 파이썬 기초문법 II


Python data structure

특징이 있는 정보는 어떻게 저장하면 좋을까?
ex. 전화번호부, 은행 번호표, 서적 정보, 창고에 쌓인 수화물의 위치 etc..

파이썬 기본 데이터 구조

  • 스택과 큐(stack & queue with list)
  • 튜플과 집합(tuple & set)
  • 사전(dictionary)
  • Collection 모듈

1. 스택(Stack)

  • 나중에 넣을 데이터를 먼저 반환하도록 설계된 메모리구조
  • Last In First Out(LIFO)
  • Data의 입력을 Push, 출력을 Pop이라고 함.
  • 리스틀 사용하여 스택 구조를 구현 가능
  • push를 append(), pop을 pop() 사용
a = [1,2,3,4,5]
a.append(10)
a.append(20)
a.pop() # 20출력
a.pop() # 10출력

  # pop은 return이 있으면서도 a가 변하는 함수.

2. 큐(Queue)

  • 먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
  • First In First Out(FIFO)
  • Stack과 반대되는 개념
  • 리스트를 사용하여 큐 구조를 활용
  • put를 append(), get을 pop(0) 사용
a = [1,2,3,4,5]
a.append(10)
a.append(20)
a.pop(0) # 1출력
a.pop(0) # 2출력

3. 튜플(tuple)

  • 값의 변경이 불가능한 리스트
  • 선언시 []가 아닌 ()를 사용
  • 리스트의 연산, 인덱싱, 슬라이싱 등을 동일하게 사용
t = (1,2,3)
print(t+t, t*2) # (1,2,3,1,2,3) (1,2,3,1,2,3) 출력
len(t) # 3출력
t[1] = 5 # Error 발생

❔ 왜 사용하는가 ❔
프로그램을 작동하는 동안 변경되지 않은 데이터를 저장 (학번, 이름, 우편번호 etc...)
함수의 반환 값등 사용자의 실수에 의한 에러를 사전에 방지

t = (1, ) # 값이 하나인 Tuple은 반드시 ","를 붙여야함

4. 집합(set)

  • 값을 순서없이 저장, 중복 불허 하는 자료형
  • set 객체 선언을 이용하여 객체 생성
>>> s = set([1,2,3,1,2,3]) # set 함수를 사용 1,2,3을 집합 객체 생성 , a = {1,2,3,4,5} 도 가능
>>> s
{1, 2, 3}
>>> s.add(1) # 한 원소 1만 추가, 추가, 중복불허로 추가 되지 않음
>>> s
{1, 2, 3}
>>> s.remove(1) # 1 삭제
>>> s
{2, 3}
>>> s.update([1,4,5,6,7]) # [1,4,5,6,7] 추가
>>> s
{1, 2, 3, 4, 5, 6, 7}
>>> s.discard(3) # 3 삭제
>>> s
{1, 2, 4, 5, 6, 7}
>>> s.clear() # 모든 원소 삭제
  • 집합의 연산
    수학에서 활용하는 다양한 집합연산 가능
>>> s1 = set([1,2,3,4,5])
>>> s2 = set([3,4,5,6,7])
>>> s1.union(s2) # s1 과 s2의 합집합
{1, 2, 3, 4, 5, 6, 7}
>>> s1 | s2 # set([1, 2, 3, 4, 5, 6, 7])
{1, 2, 3, 4, 5, 6, 7}
>>> s1.intersection(s2) # s1 과 s2의 교집합
{3, 4, 5}
>>> s1 & s2 # set([3, 4, 5])
{3, 4, 5}
>>> s1.difference(s2) # s1 과 s2의 차집합
{1, 2}
>>> s1 - s2 # set([1, 2])
{1, 2}

5. 사전(dict, dictionary)

  • 데이터를 저장 할때는 구분 지을 수 있는 값을 함께 저장
  • 구분을 위한 데이터 고유 값을 Identifier 또는 Key라고함
  • Key값을 활용하여, 데이터 값(Value)를 관리함
  • key와 value를 매칭하여 key로 value를 검색
  • 다른 언어에서는 Hash Table 이라는 용어를 사용
  • {Key1:Value1, Key2:Value2, Key3:Value3 ...} 형태

처음 pose-estimation open-source 사용을 위해 파이썬을 처음 시작할때 dict구조를 처음 보고 이해하는데에 힘들었던 기억이....

>>> country_code = {} # Dict 생성, country_code = dict() 도 가능
>>> country_code = {"America": 1, "Korea": 82, "China": 86, "Japan": 81}
>>> country_code
{'America': 1, 'China': 86, 'Korea': 82, 'Japan': 81}
>>> country_code.items() # Dict 데이터 출력
Dict_items([('America', 1), ('China', 86), ('Korea', 82), ('Japan', 81)])
>>> country_code.keys() # Dict 키 값만 출력
Dict_keys(["America", "China", "Korea", "Japan"])
>>> country_code["German"]= 49 # Dict 추가
>>> country_code
{'America': 1, 'German': 49, 'China': 86, 'Korea': 82, 'Japan': 81}
>>> country_code.values() # Dict Value만 출력
dict_values([1, 49, 86, 82, 81])

6. Collections

  • List, Tuple, Dict에 대한 Python Built-in 확장 자료 구조(모듈)
  • 편의성, 실행 효율(메모리의 사용, 실행시간 등의 효율) 등을 사용자에게 제공함
  • 아래의 모듈이 존재함
from collections import deque
from collections import Counter
from collections import OrderedDict
from collections import defaultdict
from collections import namedtuple

7. deque

  • Stack과 Queue 를 지원하는 모듈
  • List에 비해 효율적인=빠른 자료 저장 방식을 지원함
from collections import deque
deque_list = deque()
for i in range(5):
	deque_list.append(i)
print(deque_list)
deque_list.appendleft(10)
print(deque_list)
  • rotate, reverse등 Linked List의 특성을 지원함
  • 기존 list 형태의 함수를 모두 지원함
deque_list.rotate(2)
print(deque_list)
deque_list.rotate(2)
print(deque_list)
print(deque(reversed(deque_list)))
deque_list.extend([5, 6, 7])
print(deque_list)
deque_list.extendleft([5, 6, 7])
print(deque_list)
  • deque 는 기존 list보다 효율적인 자료구조를 제공
  • 효율적 메모리 구조로 처리 속도 향상

%timeit general_list() : Jupyter에서 timeit함수를 사용하여 실행시칸을 측정가능.

8. OrderedDict

  • Dict와 달리, 데이터를 입력한 순서대로 dict를 반환함
  • 그러나 dict도 python 3.6 부터 입력한 순서를 보장하여 출력함
    -> 따라서 요즘은 잘 안씀.
  • Dict type의 값을, value 또는 key 값으로 정렬할 때 사용 가능
for k, v in OrderedDict(sorted(d.items(), key=lambda t: t[0])).items():
	print(k, v)

9. defaultdict

  • Dict type의 값에 기본 값을 지정, 신규값 생성시 사용하는 방법
from collections import defaultdict
d = defaultdict(object) # Default dictionary를 생성
d = defaultdict(lambda: 0) # Default 값을 0으로 설정합
print(d["first"])

for i, v in OrderedDict(sorted(word_count.items(), key=lambda t: t[1],reverse=True)).items():
	print(i, v)

10. Counter

데이터 분석 인턴 시, 활용하기에 너무 좋았었다.

  • Sequence type의 data element들의 갯수를 dict 형태로 반환
from collections import defaultdict
c = Counter()
c = Counter('gallahad')
print(c) # Counter({'a':3, 'l':2, 'g':1, 'd':1, 'h':1})
  • Dict type, keyword parameter 등도 모두 처리 가능
  • Set의 연산들을 지원함
  • word counter의 기능도 손쉽게 제공함

11. namedtuple

  • Tuple 형태로 Data 구조체를 저장하는 방법
  • 저장되는 data의 variable을 사전에 지정해서 저장함
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
print(p[0] + p[1]) # 33
x, y = p
print(x, y) # 11, 22
print(p.x + p.y) # 33
print(Point(x=11, y=22))

이번 강의는 파이썬에서 처리되는 기본적인 자료 구조들에 대한 내용들이었기에, 다시한번 되짚어보는 느낌으로 수강했다😀


Pythonic Code

파이썬 특유의 문법을 활용하여 효율적으로 코드를 표현함

Split

string type의 값을 "기준값"으로 나눠서 List 형태로 반환

Join

한 줄로 간략하게 코드를 구성하기에 자주 사용.
어제의 과제에서도 one-line으로 표현하기 위해 많이 사용했었다.

String으로 구성된 list를 합쳐 하나의 string으로 반환

List comprehension ⭐

해당강의 교수님이 중요하다고 말씀.
join과 함께 one-line 코딩에서 나 또한 자주 사용한다.

기존 List 사용하여 간단히 다른 List를 만드는 기법
일반적으로 for + append 보다 속도가 빠름

>>> result = []
>>> for i in range(10):
... result.append(i)
...
>>> result
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> result = [i for i in range(10)]
>>> result
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> result = [i for i in range(10) if i % 2 == 0]
>>> result
[0, 2, 4, 6, 8]

enumerate

python을 처음 시작할 때 큰 매력을 느꼈었던 기능

list의 element를 추출할 때 번호를 붙여서 추출

zip

두 개의 list의 값을 병렬적으로 추출함

lambda

함수 이름 없이, 함수처럼 쓸 수 있는 익명함수

map

두 개 이상의 list에도 적용 가능함, if filter도 사용가능

코드의 직관성이 떨어져서 lambda나 reduce는 python3에서 사용을 권장하지 않음
Legacy library나 다양한 머신러닝 코드에서 여전히 사용중

iterable object

Sequence형 자료형에서 데이터를 순서대로 추출하는 object

generator

iterable object를 특수한 형태로 사용해주는 함수

가변인자(variable-length) using asterisk

Asterisk * 기호를 사용하여 함수의 parameter를 표시함
개수가정해지지 않은 변수를 함수의 paramerer로 사용하는 법

가변인자는 일반적으로 *args를 변수명으로 사용
기존 parameter 이후에 나오는 값을 tuple로 저장.

def asterisk_test(a, b, *args):
	return a+b+sum(args)
print(asterisk_test(1, 2, 3, 4, 5)) # a=1, b=2, *args = (3,4,5)

키워드 가변인자(Keyword variable-length) using asterisk

Asterisk * 기호를 두개 사용하여 함수의 parameter를 표시함
Parameter 이름을 따로 지정하지 않고 입력하는 방법

입력된 값은 dict type으로 사용할 수 있음
가변인자는 오직 한 개만 기존 가변인자 다음에 사용

def asterisk_test(a, b, *args):
	return a+b+sum(args)
print(asterisk_test(1, 2, 3, 4, 5)) # a=1, b=2, *args = (3,4,5)

피어세션 (2021.01.20)

어제 있었던 과제에 대한 간단한 피드백을 주고 받았다.
아직은 강의 내용들이 기본적인 내용들로 구성이 되어 있어, 강의내용을 통한 피드백은 진행되지 않았다.


profile
Preparation student who dreams of becoming an AI engineer.

0개의 댓글