본문 바로가기

Python/Python

(18)
[Python] decorator와 contextmanager, wraps의 사용 이번 포스팅에서는 파이썬 데코레이터에 대한 개념과 이 데코레이터와 관련된 개념들인 contextmanager, wraps의 쓰임에 대해서도 알아보도록 하자. 1. decorator란? 데코레이트는 말 그대로 '꾸미다' 라는 의미이다. 하지만 파이썬에서는 꾸미다라는 의미가 직관적이지는 않은 듯 하다. 그래서 개념 확립이 좀 필요할 듯 하다. 우선 데코레이터를 사용하는 예시 코드를 살펴보자. def decorator(func): print("decorator init") return func @decorator def add_ten(x): return x + 10 res = add_ten(100) print(res) # 출력 # decorator init # 110 decorator 라는 이름의 함수를 만들..
[Python] pyenv 와 poetry의 개념, 그리고 두 개를 함께 사용하기 오랫동안 파이썬을 사용해오면서 가상환경 관리 도구는 conda, 패키지 관리 도구는 pip 으로 사용해왔다. 사실 이 2가지를 굳이 선택한 이유는 따로 없었다. 단지 처음 파이썬을 입문하기 시작할 때 사용하던 도구가 굳혀진 것일 뿐.. 그런데 최근에 두 도구를 사용하면서 드디어(?) 불편한 점으로부터 고통을 받았다. 특히, conda의 경우는 conda 명령어로 설치할 수 있는 패키지가 매우 한정적이라는 점이여서 특히, 여러가지 파이썬 버전을 설치하는 데 제약이 많은 듯 했다. 그리고 pip은 서로 다른 패키지 간에 버전이 다름으로써 충돌이 날 수 있는 문제를 사전에 알려주지 않고, 설치한 것은 다 설치하고 잘 될거라 생각했지만 막상 코드를 실행하면 에러가 발생하는 난항을 겪었다. 그래서 이번 기회에 c..
[Python] Memory 관리에 대한 이해와 Garbage Collection(GC) 파이썬은 C 계열의 언어들과는 다르게 메모리 관리를 파이썬 스스로 수행해준다. 덕분에 많은 파이썬 개발자들은 어렵고 귀찮은 메모리 관리 작업을 파이썬에게 위임하고 편한 마음으로 개발을 시작한다. 하지만 파이썬의 메모리 누수를 유발하는 문법이나 방식을 남발(?)하게 되다 보면 파이썬에서도 Garbage Collection과 같은 것을 이용해 메모리 관리를 직접 해주는 것이 필요할 수 있다. 그런 최악의 시나리오에 들어가지 않기 위해서 파이썬 개발자로서 파이썬이 메모리를 어떻게 관리하는지 알고 싶었다. 그리고 내가 작성해오는 코드에는 메모리 누수가 없는지도 확인해보고 싶었다.(꽤 많을걸..) 그래서 여러 자료를 찾아보던 중 2015년 배준현님의 Pycon 발표 영상을 찾아보았고, 30분 남짓 되는 시간 동안..
[Python] Futures를 사용해서 병렬성(Concurrency) 수행하기 이번 포스팅에서는 Python에서 병렬성을 수행하는 방법에 대해 알아보자. 저번 포스팅에서는 Python에서 병행성을 수행하기 위한 코루틴에 대해 알아보았다. 다시 한 번 언급하지만 병행성은 여러가지 일을 순차적으로 왔다갔다 빠르게 실행함으로써 한 번에 여러가지 일을 동시에 하듯이 수행하는 것을 의미한다. 반면 병렬성은 실제로 한 번에 여러가지 일을 동시에 처리하는 것을 말한다. 이번에는 파이썬에서 병렬성을 수행하는 방법에 대해 알아보자. 파이썬에서는 병렬성을 수행하기 위해서 Futures라는 모듈을 사용한다. 자세한 내용은 파이썬 공식문서에서 살펴보자. 병렬성을 실행하기 위해서는 Futures 모듈에서 멀티 쓰레드 또는 멀티 프로세스 익스큐터를 사용한다. 멀티 쓰레드, 멀티 프로세스에 대한 개념은 저번..
[Python] 제네레이터 기반 Coroutine(코루틴) 이번 포스팅에서는 제네레이터 기반 코루틴에 대해서 알아보자. 코루틴은 Python 3.5 이상부터는 aysnc와 await 키워드를 사용하는 Native 코루틴과 def 와 yield 또는 yield from을 함께 사용하는 제네레이터 기반 코루틴이 존재한다. 여기서는 후자에 대해 알아보자. 1. 코루틴이란 무엇일까? 우선 코루틴에 대해 개념부터 살펴보자. 코루틴에 대해서 알아보기 전에 메인루틴과 서브루틴에 대해서도 잠깐 짚어보고 넘어가자. 우선 다음과 같은 함수가 있다고 가정해보자. def calc_func(x): # 서브 루틴 영역 sum_val = 0 for _ in range(5): sum_val += x return sum_val # 메인 루틴 영역 result = calc_func(100) p..
[Python] yield를 사용하는 제네레이터와 itertools의 다양한 함수들 이번 포스팅에서는 yield 키워드를 사용하는 제네레이터 함수를 만들어보고 이것이 어떻게 병행성을 구현할 수 있는지 생각해보자. 그리고 itertools 라이브러리의 다양한 함수들에 대해 간략히 사용법에 대해 알아보자. 1. yield를 사용한 제네레이터 보통 함수를 작성할 때 우리는 return 을 사용해왔다. 그러나 return 대신 yield 키워드를 사용하게 되면 제네레이터 함수를 만들어주어 병행성을 구현할 수 있다. 여기서 병행성이란, 하나의 프로세서 또는 쓰레드가 한 번에 여러가지 일을 순차적으로 번갈아가면서 수행해주어 사람의 눈에서는 여러개의 일을 동시에 처리하는 것처럼 보이게 되는 것을 말한다. 참고로 병렬성은 정말로 한 번에 여러가지 일을 실행하는 것을 의미한다. 그렇다면 파이썬에서 병행..
[Python] iterator 와 generator에 대해 알아보기 이번 포스팅에서는 Python에서 중요한 이터레이터와 제네레이터에 대해 알아보고 예시 코드도 살펴보기로 하자. 1. for loop는 어떻게 만들어질까? 파이썬에서 for를 사용한 loop는 매우 빈번하게 사용된다. 그런데 for loop는 어떤 매직 메소드를 활용해서 구현되는 것일까? 우선 아래와 같은 코드가 있다고 해보자. string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' # for loop는 iterable한 객체를 자동으로 iterator로 만들어줌 for s in string: print('for loop->', s) 위 처럼 문자열과 같은 iterable한 객체에 for loop를 사용하게 되면 for loop는 자동으로 iterable한 객체(위 코드에선 문자열)를 iter..
[Python] staticmethod 와 classmethod 쓰임의 차이 이번 포스팅에서는 파이썬 클래스 문법에서 자주 마주칠 수 있는 staticmethod(정적 메소드)와 classmethod(클래스 메소드)의 차이점에 대해 예시 코드로 알아보려고 한다. 1. staticmethod 우선 staticmethod는 다음과 같은 특징을 지닌다. 부모 클래스에서 정의된 staticmethod는 자식 클래스에서 call 할 수 있음 클래스 변수에는 접근 가능 생성자 포함 인스턴스 메소드 변수에는 접근 불가능 먼저 부모 클래스에서 정의된 staticmethod는 자식 클래스에서 call 할 수 있는 경우이다. 하단의 코드를 살펴보자. class Parent: class_val = 'class variable' def __init__(self): self.name = 'younghu..
[Python] Class 에서 return self 는 무엇을 의미할까? 이번 포스팅에서는 Python Class 문법에서 self를 return 하는 즉, return self 문법이 들어가는 이유가 무엇인지, 또 이런 문법을 사용하면 어떤 기능을 가능하게 하는지에 대해 알아보자. 이에 대해서는 원문 StackOverflow 질문을 해석하면서 이해한 것이므로 원본 질문은 여기를 참고하자. return self 는 cascading 메소드를 가능하게 한다고 한다. cascading 메소드란 무엇일까? 먼저 다음과 같은 return self를 사용하는 코드 예시가 있다. class Counter: def __init__(self, start=1): self.val = start def increment(self): self.val += 1 return self def decre..
[Python] yield로 제네레이터 함수 만들기 이번 포스팅에서는 yield로 제네레이터 함수를 만드는 방법에 대해 알아보려고 한다. 제네레이터는 이터레이터를 생성해주는 함수이다. 제네레이터, 이터레이터에 대한 포스팅은 이전에 게시했던 적이 있다. 여기서는 yield를 사용해서 제네레이터 함수를 만드는 방법에 대해 간단히 알아보자. 다음과 같이 yield를 활용해서 0부터 9까지 출력하는 제네레이터 함수를 만들어보자. def generate_num(): for i in range(0, 10): yield i 이제 이 generate_num() 함수가 제네레이터 함수로서 제대로 기능하는지 살펴보자. 제네레이터는 list, set, tuple을 씌우게 되면 모든 원소를 담고 있는 하나의 객체로 반환이 되는데, 이 generate_num() 함수도 그렇게 ..
[Python] 클래스 상속 시 super() 의 쓰임 이번 포스팅에서는 Python에서 부모 클래스를 상속받을 때 자주 사용하는 super() 메소드에 대해 헷갈렸던 점을 기록하고자 한다. 우선 다음과 같은 부모 클래스가 있다고 가정하자. class Parent: def __init__(self, p1, p2): self.p1 = p1 self.p2 = p2 def add_string(self): return self.p1 + '+' + self.p2 위 Parent 클래스 생성자 함수에 인자(argument)가 필요한 상태이다. 이 상태에서 우리는 Parent 클래스를 상속받는 Child 클래스를 만들어보자. class Child(Parent): def __init__(self): self.c1 = 'child1' # 클래스 정의 child = Child..
[Python 중급] 일급함수(First-class)와 클로저, 데코레이터 🔊 해당 포스팅은 인프런의 파이썬 중급 강의를 공부하면서 복습차원으로 정리한 포스팅입니다. 해당 내용은 주로 본인의 복습용이라서 자세한 설명은 없는 점 양해 부탁드리겠습니다. 원본 코드는 여기에 있습니다. 이번 포스팅에서는 파이썬의 일급함수(일급객체)의 특징에 대해 간단히 알아보고, 데코레이터를 만들기 위해 필요한 클로저에 대해 실습해보고 클로저 함수를 이용해 데코레이터까지 만들어보는 실습을 해보자. 1. 일급함수(First-class)의 특징 파이썬 일급함수의 특징으로는 다음의 4가지 특징이 존재 런타임 초기화 : 실행 시점에 초기화가 됨을 의미 함수를 변수에 할당이 가능 함수를 또 다른 함수 인자로 전달 가능 함수 결과를 다른 함수 결과값에 할당에 반환 가능 먼저 함수를 변수에 할당이 가능한 예시를 ..
[Python 중급] Python 시퀀스 🔊 해당 포스팅은 인프런의 파이썬 중급 강의를 공부하면서 복습차원으로 정리한 포스팅입니다. 해당 내용은 주로 본인의 복습용이라서 자세한 설명은 없는 점 양해 부탁드리겠습니다. 원본 코드는 여기에 있습니다. 이번 포스팅은 파이썬의 시퀀스 자료구조에 대해서 알아보고 이에 대해 실습도 해보자. 우선 파이썬 데이터 타엡에 대해 세부적으로 분류해보자. 1번째 기준 : 자료 구성 형태 컨테이너 - 서로 다른 자료형 구성 가능 : 리스트, 튜플, collections의 deque 플랫형(Flat) - 한 개의 자료형으로 구성 : 문자열(str), bytes, bytes array, array, memoryview 2번째 기준 : 자료 구조의 변경 가능 여부 가변형 자료구조 : 리스트, bytes array, arra..
[Python 중급] Magic method와 named tuple 🔊 해당 포스팅은 인프런의 파이썬 중급 강의를 공부하면서 복습차원으로 정리한 포스팅입니다. 해당 내용은 주로 본인의 복습용이라서 자세한 설명은 없는 점 양해 부탁드리겠습니다. 원본 코드는 여기에 있습니다. 이번 포스팅은 지난 포스팅에서 잠깐 살펴보았던 Magic method(매직 메소드)에 대해 알아보고 실습 예제로 구현해보자. 또한 Tuple 성질을 지니지만 마치 파이썬 자료구조 중 하나인 Dictionary 처럼 Key, Value를 갖는 Named Tuple에 대해 알아보고 간단한 실습으로 구현해보자. 우선 Special method 라고도 불리우는 매직 메소드는 이미 내장되어(built-in) 만들어진 메소드를 의미한다. 즉, 다음 코드와 같이 int 형도 하나의 클래스이며 다음과 같은 여러가지 ..
[Python 중급] Class와 Method 심화 🔊 해당 포스팅은 인프런의 파이썬 중급 강의를 공부하면서 복습차원으로 정리한 포스팅입니다. 해당 내용은 주로 본인의 복습용이라서 자세한 설명은 없는 점 양해 부탁드리겠습니다. 원본 코드는 여기에 있습니다. 객체 지향 프로그래밍(OOP)는 코드의 재사용과 코드 중복을 방지하기 위한 프로그래밍 방법이다. 이번 포스팅에서 Python 클래스와 메서드에 대한 사용법에 대해 예시 코드로 알아보자. class Car(object): def __init__(self, company, detail): self._company = company self._detail = detail # Python에 내장되어 있는 메소드를 활용해서 인스턴스에 있는 정보 출력 가능 # __str__은 사용자 입장에서 사용하는 출력 메서드..
[Python] 패키지, 라이브러리, 모듈... 넌 진짜 알아? 최근에 이쪽 분야를 공부하면서 가장 힘들고 고난스러운 점은 용어 자체가 이해하기 어렵다는 것이다. 용어가 외래어 처럼 되있을 뿐만 아니라 사전적 의미에 대한 명확한 정의도 없고 한 특정 키워드에 대한 개념설명을 읽다가도 용어에 대해 인지를 못해서 c로 시작하는 욕을 한적이 한 두번이 아닌 거 같다...그러는 차원에서 작은 컨텐츠로 혼동할 수 있는 용어에 대해서 간단하게 정의해 보려고 한다. 먼저 수식으로 개념에 대한 종속 관계부터 알아보자. 패키지 = 라이브러리 = 모듈의 합 = 클래스의 합 = 객체(함수들)의 합 예시를 통해서 이해하는게 가장 빠를 것이다. 우선 주석처리를 한 것을 읽고 이해하면 된다. 그리고 난 이번기회를 통해서 새롭게 알게 된 사실이였는데 from ~ import 구문을 쓸 때 . ..
[Python] Class와 Object 개념과 이해 파이썬을 처음 접할 때는 그렇게 어렵다고 느껴지지 않았지만 클래스와 객체 단계만 다가오면 머리가 하얘지고 무슨 말인지 도통 몰랐다.. 심지어 패스트캠퍼스의 강의를 들었음에도 불구하고.... 그런데 코딩 유투버를 보다가 '워니' 라는 사람의 영상을 접하게 되었고 설명하는 방식이 이해하기 쉬운 것 같아 인상깊었던 와중에 1시간 분량의 파이썬 정복기라는 엑기스 영상을 올린걸 보게 되었다. 그리고 시청 후 소감은 정말 설명을 잘해주셨고 드디어 클래스와 객체에 대해서 이해가 많이 된 느낌을 받았다. 하지만 이 느낌도 곧 까먹게 될 것 같다... 사라지기 전에 빨리 이제 복습해보자! 우선 클래스 속에 객체가 있다고 볼 수 있겠다. class를 정의해주고 그 안에 임의의 함수를 만들어 준다. 그리고 __init__의..
[Python공부] 12.19 - 1일차_몰랐던 기본문법 1. + 를 이용해서 문자열을 결합 가능 2. * 를 이용해 문자열 복제가능 ex) 'a man ' *3 하면 a man a man a man 출력 3. 문자열은 불변하기 때문에 해당 인덱스 번호에 새로운 문자를 할당할 수 없음! -> 대신 replace함수사용 4. 슬라이스 ㄱ. [ : ] 처음부터 끝까지 시퀀스 출력 ㄴ. [start : ] start부터 끝까지 시퀀스 출력 ㄷ. [ : end ] 처음부터 end-1 까지 시퀀스 출력 ㄹ. [start : end ] start부터 end-1 까지 시퀀스 출력 ㅁ. [start : end : step ] start부터 end-1까지 step만큼 문자를 건너뛰면서 출력 5. split 함수 -> 변수명.split('구분기준') 으로 나눔 만약 '구분기준'..