본문 바로가기

Study/AI

[부스트코스 코칭스터디 AI Basic 1기] #1-3. 파이썬 기초 문법Ⅱ

반응형

본 포스트는 '부스트코스 코칭스터디 AI Basic 1기'로 활동하고 '인공지능 기초 다지기' 강의를 들으며 공부한 것을 정리한 글입니다. 굳이 이걸 왜 기초에서 알아야하나 싶은 게 많아서 뒷부분은 생략했습니다. 필요 시 나중에 보충할 예정입니다.

# 1. Python Data Structure(파이썬 자료구조)

자료구조는 데이터를 저장할 때, 데이터 특징에 따라 컴퓨터에 효율적으로 정리하기 위한 데이터의 저장 및 표현 방식을 의미한다. 데이터의 특징에 알맞은 형태로 데이터를 저장하면 컴퓨터의 메모리를 효율적으로 사용하고 코드 작성에도 편리해진다.

 

1. 스택과 큐(stack & queue with list)

스택

나중에 넣은 데이터를 먼저 반환하는 메모리 구조이다. 

Last In First Out, 즉 LIFO라고 한다. Data의 입력을 Push, 출력을 Pop이라고 한다.

리스트를 사용해 스택 구조를 구현할 수 있는데 push는 append()에, pop은 pop()을 사용한다.

 

스택과 반대로, 먼저 넣은 데이터를 먼저 반환하는 메모리 구조이다.(선입선출)

First In First Out, 즉 FIFO라고 한다. Data의 입력을 Put, 출력을 Get이라고 한다.

리스트를 사용해 큐 구조를 구현할 수 있는데 put은 append()에, get은 pop(0)을 사용한다.

 

2. 튜플과 집합(tuple & set)

튜플

값의 변경이 불가능한 리스트이다. '[]'가 아니라 '()'를 사용한다. 

리스트에서 사용하는 연산, 인덱싱, 슬라이싱 모두 그대로 사용할 수 있다. 그렇지만 튜플 데이터 자체에는 변화를 줄 수 없다. 값을 바꿀 수 없기 때문에 실수로 인한 에러를 방지할 수 있다.

 

집합

값을 순서없이 저장하고 중복을 허용하지 않는 자료형이다. set()으로 감싸서 집합 객체를 만들 수 있다.

add(), remove(), update(), discard(), clear()를 통해 원소를 추가하고 삭제할 수 있다. 또한 union() 또는 |, intersection() 또는 &, difference() 또는 -를 통해서 각각 합집합, 교집합, 차집합 연산을 할 수 있다.

 

3. 사전(dictionary)

데이터를 key와 value로 구분하여 저장한다. 각각의 key와 value는 매칭되고 key로 value를 검색할 수 있다.

파이썬이 아닌 다른 언어서는 딕셔너리를 Hash Table이라고 부른다.

기본적으로 (key, value)는 튜플 형식이다.

 

딕셔너리 데이터 출력하기

for dict_items in country_code.items():
	print(type(dict_items))

key 값만 출력하기

country_code.keys()

value 값만 출력하기

country_code.values()

언패킹 해서 key, value 모두 출력하기

for k, v in country_code.items():
	print("key : ", k)
    print("value : ", v)

 

4. Collection 모듈

list, tuple, dict에 대한 Python Built-in 확장 자료 구조(모듈)이다.

from collections import deque, counter, OrderedDict, defaultdict, namedtuple 로 사용할 수 있다.

 

# 2. Pythonic Code(파이썬 스타일 코드)

python을 사용하면 다른 코드에 비해 쉽게 작성할 수 있는 것이 많다. 대표적인 예가 for문 대신에 함수의 인자로 리스트를 전달하는 것이 있다. 여러가지 pythonic code를 살펴보자.

 

0. Why Pythonic Code?

이미 많은 개발자들이 python 스타일로 코딩하기 때문에 남의 코드에 대한 이해도를 높일 수 있다. 또한 단순 for문을 사용하는 것보다 list가 더 빠르기 때문에 효율이 좋다. 제일 중요한 것은 간지가 난다.

 

1. split & join

split()

string type의 값을 "기준값"으로 나눠서 list 형태로 변환한다.

join()

list 안의 문자들을 합친다.

example.split(".")
"-".join(colors)

2. list comprehension

기존 리스트를 사용하여 간단하게 다른 리스트를 만드는 것이다. for + append 보다 속도가 빠르다.

# list comprehension
result = [i for i in range(10)]
result = [i for i in range(10) if i % 2 == 0] # if로 조건도 추가할 수 있다. -> 필터

# for + append
result = []
for i in range(10):
	result.append(i)

이중 for 문도 list comprehension으로 구현할 수 있다.

word_1 = "Hello"
word_2 = "World"
result = [i+j for i in word_1 for j in word_2]

# general
for i in word_1:
	for j in word_2:
    	result.append(i+j)

그 밖에 다양한 list comprehension 사용법이 있다. 일차원/이차원 적용도 가능하다.

3. enumerate & zip

enumerate

list의 element를 추출할 때 index를 붙여서 추출한다.

for i, v in enumerate("ABC"):
	print("{0}\t{1}".format(i,v))

>>> 0 A
1 B
2 C

zip

두 개의 list의 값을 병렬적으로 추출한다.

alist = ['a1', 'a2', 'a3']
blist = ['b1', 'b2', 'b3']

# 튜플로 뽑기
[ c for c in zip(alist, blist) ]

# 리스트로 뽑기
[ [a,b] for a,b in zip(alist, blist)]

4. lambda & map & reduce

lambda

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

다만, PEP8에서는 lambda 사용을 지양하며 def를 쓸 것을 추천하고 있다.(문법이 어렵고 남들이 보기 어려워서)

# Lambda func
f = lambda x,y : x+y
(lambda x,y : x+y)(1,4)
print(f(1,4))

# General func
def f(x,y):
	return x+y
print(f(1,4))

map

map() 함수의 첫 번째 인자로 들어온 함수를 map() 함수의 두 번째 인자마다 적용시킨다.

두 개 이상의 list에도 적용할 수 있고, if filter도 사용할 수 있다.

하지만 map 보다는 list comprehension을 이용하는 방법이 권장된다.

ex = [1,2,3]
f = lambda x: x**2

list(map(f, ex))

 

5. generator

 

6. asterisk

반응형