데코레이터 (Decorator)
·
[Language] - Python
개요데코레이터를 이해하기 이전에 함수형 프로그래밍에 대한 (함수를 일급시민으로 취급하는) 개념을 먼저 살피고 오면 좋다. 데코레이터는 사전적으로 장식자라는 의미를 가지고 있으며, 장식의 대상이 되는 함수를 데코레이터 함수의 인자로 전달하여 내부적으로 실행방식을 래핑(Wrap)한다. 데코레이터 사용법은 대상이 되는 함수 위에 @데코레이터명 을 쓰면 된다. 예를 들면, @staticmethod, @classmethod, @property 등 다양한 데코레이터들이 있고, 사용자가 임의로 데코레이터를 정의할 수도 있다. 클로저 (Closure)def closure(msg): def wrapper(): print(msg) return wrapperfunc = closure("Hello,..
Python 객체의 생명 주기와 메모리
·
[Language] - Python
개요어떤 언어든 마찬가지이지만, 비즈니스 로직을 구현할 때 메모리 관리에 신경 쓰지 않으면 메모리 누수(Memory Leak) 현상이 발생할 수 있다. 이는 시스템 성능 저하로 이어질 수 있으며, 특히 규모가 커질수록 바늘 찾기(needle in haystack)처럼 문제의 원인을 찾기 어려워질 수 있다. 따라서 초기 단계부터 단위 테스트와 함께 메모리 관리에 신경 써야 할 부분이기도 하다.C 언어는 malloc(), free()로 메모리를 직접 관리해야 하지만, Python은 Java처럼 가비지 컬렉터(GC)가 객체의 메모리를 자동으로 수거해주기 때문에 개발자는 비즈니스 로직에 더 집중할 수 있다. 하지만 객체 간 복잡한 참조가 발생할 경우, 개발자가 인지하지 못한 곳에서 객체가 메모리에서 제대로 해제..
[Tip] 딕셔너리 Fancy하게 다루기
·
[Language] - Python
개요이번 포스트에서 다룰 내용은 딕셔너리를 좀더 fancy하게 다루는 방법들을 알아보려고 한다. 물론 기본 문법(for loop, if, ..)들로도 충분히 원하는 딕셔너리에 대한 데이터 전처리가 가능하지만, 가능한 가독성이 좋고 Python에서 지원하는 문법들을 적극 활용하여 딕셔너리를 다룰 수 있는 방법들이 있다. 딕셔너리 컴프리헨션 (Dictionary Comprehension)# 컴프리헨션 적용 전squares = {}for x in range(10): squares[x] = x ** 2# 컴프리헨션 적용 후 ({키: 밸류 for 원소 in 반복할 iterable})squares = {x: x ** 2 for x in range(10)}print(squares) # {0: 0, 1: 1, ..
[Tip] win32com 모듈을 사용한 엑셀 제어
·
[Language] - Python
# Excel.Application COM 인스턴스 생성excel = win32.Dispatch("Excel.Application")excel.Visible = Truecell = None# 파일 열기workbook = excel.Workbooks.Open(self.path)# 시트 순회for worksheet in workbook.Worksheets: print('This sheet name is .. ', worksheet.Name) # 시트 이름 출력 cell = worksheet.UsedRange.Find(self.tag) # 워크시트의 Range 인스턴스에서 찾기 if not cell: continue worksheet.Range(str(cell.address).replace("$", ''..
제너레이터 (Generator)
·
[Language] - Python
개요이번 포스트에서는 제너레이터에 대해 알아보고자 한다. 제너레이터는 지연 평가(Lazy Evaluation)을 통해 효율적인 메모리 관리를 가능케 해주는 iterable 객체이다. 제너레이터를 이해하기 위해서는 Eager Evaluation과 Lazy Evaluation의 개념을 알아야 한다. Eager Evaluationdef return_func(): print('return!') return 1li_com = [return_func() for i in range(10)]print(li_com)>>return!return!return!return!return!return!return!return!return!return![1, 1, 1, 1, 1, 1, 1, 1, 1, 1]Eager는 ..
함수형 프로그래밍
·
[Language] - Python
개요함수형 프로그래밍은 프로그램을 수학적 함수의 계산으로 바라보고 상태 변화와 가변 데이터를 최소화하는 프로그래밍 패러다임이다. 일급 시민(first citizen)을 객체 지향 프로그래밍에서는 객체 위주의 사고를 했었다면, 함수형 프로그래밍에서는 함수가 일급 시민이 된다. 즉, 함수를 객체처럼 특정 자료 구조에 담거나 함수의 인자로 전달하는 등의 행위가 가능하다. 함수형 프로그래밍은 아래와 같은 특징들이 있다. 순수 함수 (Pure Function)def add(x, y): return x + y동일한 입력에 대해 항상 동일한 출력을 반환한다. 또한, 함수가 자신의 외부 상태를 변경하지 않으며 사이드 이펙트가 없어야 한다. 예를 들면, 함수 내부에서 전역 변수나 외부 데이터를 수정하지 않아야 한다..
[Tip] if문 분기와 삼항연산자가 사용하기 싫을 때
·
[Language] - Python
개요코드를 작성하다보면 복잡한 도메인 혹은 비즈니스 요구사항에 의해 고려해야할 케이스가 많아지기도 한다. 예를 들면, 팩토리 패턴의 경우, 다양한 케이스 별로 분기하여 대응되는 클래스의 인스턴스를 초기화하는 일종의 공장 역할을 하는 클래스를 분리한다. 하지만, 결국 필자가 생각하기에 if 문 혹은 switch ~ case와 같은 형태의 가독성을 해치는 보일러 플레이트는 여전히 남아있다.다행히도 Python에서는 딕셔너리라는 객체가 존재하고, 메소드 자체를 마치 객체처럼 다룰 수 있는 스크립트의 성질이 있기 때문에 이를 응용하여 if 문 분기를 사용하지 않고도 비교적 깔끔한 코드를 작성할 수 있다. 사용 예시MAP_COLOR = {True: QColor(247, 230, 0), False: Qt.tra..
zip
·
[Language] - Python
개요본 포스트에서는 Python의 zip() 함수에 대해 알아본다. zip() 함수는 iterable(순회 가능한 객체)들을 원소 단위로 묶어주는 역할을 수행한다. zip() 함수를 통해 데이터를 전처리할 때, Pythonic하고 유연하게 수행할 수 있는 장점이 있다. 사용 예시a = ['a', 'b', 'c']b = [1, 2, 3]zip(a, b) # zip() 함수의 반환값은 입력으로 주어진 iterable의 타입이 아닌 zip 타입의 객체가 반환되는 것을 확인할 수 있다. for pair in list(zip(a, b)): print(pair)>>('a', 1)('b', 2)('c', 3)zip 인스턴스를 list로 캐스팅하고 for loop를 돌린 결과 다음과 같이 두 iterator의 ..
property 데코레이터
·
[Language] - Python
개요작업을 하던 도중 처음보는 데코레이터를 발견했다.. 보통 우리는 객체의 필드에 직접 접근하는 것을 방지하기 위해 protected나 private 접근제한자를 사용하고, getter와 setter를 통해서만 접근할 수 있도록 캡슐화(Encapsulation)을 한다. 이러한 과정을 간소화 시켜주는 것이 프로퍼티의 역할이다. 사용 예시class Palette: def __init__(self): self.__color = 'blue' def get_color(self): return self.__color def set_color(self, color): self.__color = color def del_color(self): ..
덕 타이핑 (Duck Typing)
·
[Language] - Python
개요필자는 스트래티지 패턴을 공부하던 도중 인터페이스를 사용하는 예제를 보았다. 그러자 갑자기 의구심이 들었다. Python에는 인터페이스가 없나?? 그래서 바로 구글링을 했다. 그리고 다음과 같은 답변을 보았다. 파이썬이 다중 상속이 가능한 것은 알고있었지만 덕 타이핑? 이라는 말은 처음 들어봤다. 그래서 바로 또 서칭서칭! Duck Typing - 'If it walks like a duck and it quacks like a duck, then it must be a duck' 해석해보면 '오리처럼 걷고, 오리처럼 꽥꽥거리면, 그것은 틀림없이 오리다.' 라는 뜻입니다. 그렇다. 필자는 오리를 매우 좋아한다. 그게 중요한게 아니라 Python은 객체의 타입보다 행위를 더 중요하게 여긴다는 의미이다...