Computer/Python (57) 썸네일형 리스트형 namedtuple 인스턴스 확인 collections 내장모듈의 namedtuple은 tuple의 불변성과 클래스의 속성접근 특성을 합친 많이 쓰이는 파이썬의 자료구조입니다. 다음과 같이 issubclass 내장함수를 사용하면 namedtuple로 선언한 클래스가 tuple의 자식클래스임을 알 수 있습니다. >>> Point = namedtuple('Point', ['x' 'y']) >>> pt = Point([1,2]) >>> issubclass(Point, tuple) True 그렇다면 우리가 다루는 인스턴스가 namedtuple 자료구조로부터 왔는지 어떻게 확인할 수 있을까요? 먼저 type 함수를 통해 pt 인스턴스의 타입을 살펴보면 namedtuple로 선언한 클래스 이름이 나옵니다. 하지만 우리는 클래스 이름을 모르는 상황을.. 파이썬의 memory management 파이썬 또한 프로그래밍 언어이기 때문에 컴퓨터 메모리 (RAM) 상에 데이터를 저장하고 (write) 읽는 (read) 작업을 수행해야합니다. 파이썬 프로그램이 수행된다면 데이터를 저장할 메모리 공간을 할당받고 더 이상 쓰이지 않는 메모리 공간을 해제하는 작업이 필요하다는 것이죠. 그렇다면 파이썬 프로그램에서 물리 메모리 상의 특정 공간까지 데이터 read/write는 어떤 방식으로 이루어질까요? 파이썬 코드가 컴퓨터 상에서 실제로 수행되기 위해서는 컴퓨터가 이해할 수 있는 특정한 종류의 언어로 먼저 변환되어야 합니다. 파이썬은 C 언어로 구현된 CPython으로 구현되어 있고 CPython은 파이썬 코드를 컴퓨터가 이해할 수 있는 어셈블리 언어와 비슷한 bytecode로 파이썬 코드를 컴파일합니다. B.. 파이썬과 객체 파이썬의 설계 철학은 간단함입니다. C/C++ 에서와 같이 포인터라는 복잡한 개념을 명시적으로 사용하지 않고 메모리 관리를 별도로 할 필요없이 속도 대신 범용성을 추구하는 usability가 설계의 근본으로 자리잡고 있습니다. 이는 Zen of Python 에서도 잘 드러납니다. 언제나 Zen of Python을 읽을 때마다 내 자신이 파이썬 철학에 맞게 구현하고 있는지 반성하게 됩니다... Beautiful is better than ungly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better.. 파이썬의 Namespace와 Scope Namespace 파이썬에서 할당은 (assignment, =) 특정 객체에 변수 이름을 부여하는 행위를 말합니다. 예를 들어 "x=3" 이라면 3이라는 객체를 x라는 변수 이름으로 할당하고 x라는 이름은 3이라는 객체의 레퍼런스가 됩니다. Namespace (이름공간)는 여러 객체와 그것의 레퍼런스가 (이름) 사전 타입으로 (키는 객체 레퍼런스의 이름, 값은 객체) 묶인 콜렉션으로 다음과 같이 4가지 타입이 존재합니다. Built-in namespace Built-in namespace 에는 파이썬의 built-in 객체의 이름이 담긴 것으로 파이썬이 구동되고 있다면 언제 어디서든 사용할 수 있는 것들로 구성되어 있습니다. 파이썬에서 다루는 사전예약된 키워드 (return, local, id, dict.. 파이썬의 매개변수 전달 방식 파이썬에서 함수의 매개변수 (arguments) 는 어떻게 전달될까요? C/C++ 언어에 익숙한 사람이라면 전달값이 복사되어 매개변수에 전달하는 pass by value (call by value), 존재하는 변수의 레퍼런스 (혹은 메모리 주소) 를 전달하는 pass by reference (call by reference) 를 생각하겠지만 파이썬에서는 pass by assignment 방식으로 함수의 매개변수에 값을 전달합니다. Pass by value / reference in python 다음 코드를 살펴보겠습니다. 파이썬에서는 할당된 객체의 메모리 주소를 반환하는 id() 내장함수가 있고 이를 통해 1) 함수 매개변수가 원래의 변수와 같은 주소를 가지는지와, 2) 같은 이름으로 변수를 재할당 했을.. Property, Setter, Getter 다른 언어를 사용하다 보면 클래스의 attribute를 위한 getter, setter 메소드를 명시적으로 정의하는 경우가 많습니다. 하지만 이런 코드는 파이썬답지 않고 필드 값을 증가시키는 연산 등의 경우에는 이런 메서드를 사용하면 코드가 지저분해지게 됩니다. (e.g. r0.set_ohms(r0.get_ohms() - 40)) class OldResistor: def __init__(self, ohms): self._ohms = ohms def get_ohms(self): return self._ohms def set_ohms(self, ohms): self._ohms = ohms r0 = OldResistor(50) print(f'Before: {r0.get_ohms()}') r0.set_ohms(.. concurrent.futures를 이용한 병렬화 매우 많은 연산량을 요구하는 파이썬 프로그램에 대해서는 병렬화 없이 결국 성능의 벽에 부딪치게 됩니다. 멀티 스레드를 사용하고자 하더라도 파이썬의 GIL (Global Interpreter Lock)으로 인해 파이썬 스레드는 진정한 병렬 실행이 불가능하므로 하나의 계산을 여러 작업으로 나누는 작업은 파이썬에서는 불필요합니다. 그렇다면 성능에 결정적인 영향을 미치는 부분을 하부 기계에 가까운 C 언어를 사용한 확장 모듈로 작성할 수 있겠지만 여러 부분을 C 언어로 바꾸어야 해서 많은 비용이 들고 포팅하는 과정에서 무수히 많은 버그가 발생할 수 있습니다. 파이썬에서 진정한 병렬화를 통해 속도 향상을 시키기 위해서는 파이썬 3.2 버젼부터 생성된 concurrent.futures 모듈의 multiprocess.. 데코레이터와 functools.wrap 파이썬은 함수에 적용할 수 있는 데코레이터 (decorator)를 정의하는 특별한 구문을 제공하는데, 데코레이터는 자신이 감싸고 있는 함수가 호출되기 전과 후에 코드를 추가로 실행합니다. 이는 데코레이터가 자신이 감싸고 있는 함수의 입력 인자, 반환 값, 함수에서 발생한 오류에 접근할 수 있다는 뜻으로 함수의 의미를 강화하거나 디버깅, 함수를 등록하는 등의 일에 유용하게 사용할 수 있습니다. 예를 들어 함수가 호출될 때마다 인자 값과 반환 값을 출력하고 싶을때 다음과 같은 "trace" 라는 데코레이터를 정의할 수 있습니다. def trace(func): def wrapper(*args, **kwargs): result = func(*args, **kwargs) print(f'{func.__name__}.. 이전 1 2 3 4 5 6 7 8 다음