AI개발을 공부하면서 Python을 정식으로 공부하고 있습니다. 다른언어를 사용하는 사람들이 딱보면 알수있는것들은 모두 제외하고 파이썬만의 특징이 되는것을 정리해보고자 합니다. 여러 언어를 동시에 사용하다보니 이런 노트가 도움이 되더군요. 저는 C++과 자바스크립트를 많이 사용하고있는데 이런이유로 C++ 개발자 시점에서 글을 작성할것 같습니다.
자료구조
Collection – 파이썬에서는 배열, 리스트같은 데이터 덩어리를 Collection이라 부릅니다.
- List – C++의 Vector 및 List에 해당, 스택메모리를 사용하는 정적 배열은 없음. 표기 [1, 2, 3]
- Tuple – 수정불가능한 배열 이지만 힙메모리 사용. 하지만 여전히 List보다 메모리낭비가 적고 가비지 컬렉션 비용도 적음.
- Set – C++의 HashSet<T>, 중복 불허, 순서 없음, 해시 기반
- Dictionary – C++의 HashMap<K,V> 해시 테이블 기반 키-값 구조
알고리즘
Lambda 람다
제곱을 구하는 람다 함수
lambda(Python)
lambda x : x * x
lambda(C++11이상)
[](int x) { return x * x; }
Map 변환
리스트의 각 요소의 값을 제곱할 때
map(Python)
res = map(lambda n : n * n, v)
std::transform(C++)
std::transform(v.begin(), v.end(), res.begin(), [](int n) { return n * n; });
Filter 여과
List에서 짝수만 추출하기
filter (Python)
res = filter(lambda x : x % 2 == 0, v)
std::copy_if (C++)
std::copy_if(v.begin(), v.end(), std::back_inserter(res), [](int n) { return n%2==0; } );
Reduce 축약
reduce (Python)
from functools import reduce
v = [1,2,3,4,5]
sum = reduce(lambda a, b: a + b, v)
std::accumulate (C++)
int sum = std::accumulate(v.begin(), v.end(), 0, [](int a, int b) { return a + b; });
기타 파이썬 특징
First-Class Citizen (일급객체)
일급객체란? 다음 세 가지 조건을 모두 만족함.
- 변수 혹은 자료구조 안에 그 객체를 담을수 있다.
- 매개 변수로 전달할 수 있다.
- 리턴값으로 사용될수있다.
일급 객체 목록
- 함수
- 기본 데이터타입 int, float, str
Closure
파이썬에서는 global과 nonlocal 키워드를통해 함수내에서 전역변수를 선언하거나 가져올수있고 상위 함수의 지역변수를 가져와 수정이 가능하다. 이런것을 가능하게 해주는것이 Closure 덕분이다.
클로저(Closure) 하위함수가 상위함수의 변수(프리 변수)를 참조할 때, 상위함수가 종료된 후에도 하위함수가 기존 상위함수의 스코프내부 상태를 참조할 수 있도록 데이터를 기억하고있습니다. 이 클로저가 작동하려면 다음 세 가지 조건을 만족해야합니다.
- 계층구조를가진 nested 함수
- 하위 함수가 상위 함수의 변수를 참조
- 상위 함수에서 하위 함수를 리턴
# 클로저 함수의 예시
def parent_function():
greeting = 'Hi i'm greeting.'
def nested_function(): # 조건 1 충족
print(greeting) # 조건 2 충족
return nested_function # 조건 3 충족