콘텐츠로 건너뛰기
Home » Development » Python » Page 8

Python

bisect – 이진탐색 알고리듬

이진탐색은 데이터가 정렬된 상태일 때, 특정한 값을 매우 우수한 성능으로 탐색할 수 있는 알고리듬으로 실제로도 널리 이용된다. 이진탐색은 정렬된 데이터에서 특정한 값을 찾을 때 사람이 하는 것과 유사하게 처리되는데, 리스트의 한 가운데 지점의 값을 비교하여 찾는 값이 그보다 작으면 왼쪽에 그보다 크면 오른쪽에 있다는 것으로 탐색 범위를 매 시행마다 절반으로 줄여나가기 때문에 특히 규모가 큰 데이터에서 빠르게 조회가 가능하다는 장점이 있다.1 이전에 이진 탐색 알고리듬 적용을 위한 이진 탐색 트리 클래스를 작성하는 내용으로 포스팅을 발행한 적이 있는데, 파이썬은 bisect라는 내장… 더 보기 »bisect – 이진탐색 알고리듬

파이썬의 파일입출력 정리

프로그램에서 처리한 결과는 화면에 출력되기도 하지만, 나중에 따로 사용하기 위해서 별도의 저장 공간에 기록해 둘 필요도 있을 수 있다. 별도의 공간에 기록해두고 다시 쓴다는 것은 곧 파일의 형태로 디스크에 기록하고, 다시 파일의 내용을 읽어들일 수 있어야 한다는 것이다. 이처럼 파일에 어떤 데이터를 기록하고 다시 파일을 읽어들이는 것은 초보자가 생각하기에는 어려운 과정일 수도 있지만, 사실 “입출력”이라는 프로그램의 기본적인 기능에 관련된 부분이기 때문에 대부분의 프로그래밍 언어가 이에 대한 기본적인 API를 제공해주고 있다. 파일을 보는 시각에 대해 파일 입출력에서 API 사용법보다 중요한 것은… 더 보기 »파이썬의 파일입출력 정리

파이썬 소켓 연결 사용법

네트워크 프로그래밍 분야에서 소켓은 연결된 네트워크의 양 끝단을 추상화 시킨 개념이며, 컴퓨터의 관점에서는 네트워크로 통하는 컴퓨터의 외부와 컴퓨터 내부의 프로그램을 이어주는 인터페이스이다. 소켓의 개념에 대해서 이 글에서 모두 소상히 설명할 수는 없고, 네트워크를 통해서 바이트스트림을 주고 받을 수 있는 창구라 보면 된다. 다만 단순히 프로그램의 내부와 외부를 잇는 표준 입출력과는 달리 소켓은 네트워크의 반대편이 어디인지에 대한 정보를 가지고 있다. 즉 우리가 택배를 보낼 때 박스에 물건을 넣고 받는 사람 주소를 쓰는 것과 비슷하게 소켓은 어디로 보내지는 창구라는 것이 명시된 택배 상자 같은 것이다.

더 보기 »파이썬 소켓 연결 사용법

(파이썬) Counter 사용법

Counter Counter 는 collections 아래에 정의된 사전(dict)의 서브 클래스로 일련의 집합에서 각 원소의 출현 횟수를 세어서 유지한다. 즉 원소:출현빈도의 사전이 생성된다. 생성된 카운터 사전은 일반 사전과 유사하게 키:값 쌍을 추가/삭제하거나 업데이트 할 수 있고, 각 원소를 출현횟수만큼 반복하여 조합해서 복구한다. 텍스트에서 단어의 출현횟수 세기 아래 예제는 특정한 텍스트에서 해당 텍스트를 구성하는 모든 단어와, 그 단어의 출현 빈도를 세는 코드이다.  총 세 가지로 접근한다.  첫 번째 코드는 순수하게 사전만 사용한다. {단어:출현횟수} 로 구성되는 사전에 단어가 있으면 횟수를 +1하고 없으면 값이 1이 되도록 키를… 더 보기 »(파이썬) Counter 사용법

asyncio – 일반 함수를 비동기로 사용하기

지난 글에서 urlopen()과 같은 표준 라이브러리 함수를 어떻게 비동기 코루틴처럼 asyncio에서 사용할 수 있는지 살펴보았다. aiohttp 등의 비동기 라이브러리를 사용해서 여러 핸들러를 작성해야 할 때, 이와 같은 처리를 많이 해야 한다면 빈번하게 런루프 메소드를 호출하는 것보다, 간단히 데코레이터를 만들어서 활용하는 것이 어떨까? asyncio의 이벤트 루프에는 run_in_executor(executor, fn, *args) 가 있다. 이 메소드는 concurrent.futures 모듈의 ThreadPoolExecutor나 ProcessPoolExecutor를 사용하여 일반적인 blocking 함수를 다른 스레드 및 프로세스에서 실행하도록 하고 그 자신은 처리를 기다리는 코루틴을 생성한다. 이 기능을 사용하면 일반적인 blocking-I/O 함수를 non-blocking 함수처럼… 더 보기 »asyncio – 일반 함수를 비동기로 사용하기

Python 표준 함수를 asyncio에서 비동기로 호출하는 방법

파이썬 3.4에서 asyncio 가 추가되어 I/O 바운드된 작업을 단일 스레드에서 비동기로 처리할 수 있는 방법이 생겼다. 하지만 대부분의 파이썬 내장 라이브러리 함수들은 코루틴이 아닌 일반 함수들이며, 이들은 모두 블럭킹 방식으로 동작한다. 즉 asyncio 의 비동기는 실질적으로는 I/O 액세스처럼 CPU가 관여할 필요가 없는 일들에 대해서 “병렬적으로 기다리는” 식으로 동시다발적인 처리의 전체 수행 시간을 줄이는 식으로 동작하는데, 그 중에 이런 블럭킹 함수로 처리되는 과정이 끼어 있다면 수행 시간 단축이 어렵게 된다. 런루프 이 블로그의 다른 글에서도 몇 번 이야기했듯이, 파이썬에는 GIL(전역 인터프리터… 더 보기 »Python 표준 함수를 asyncio에서 비동기로 호출하는 방법

람다표현식과 맵, 필터, 리듀스 (Python)

람다(lambda, )는 본래 수리논리학에서의 함수정의를 추상화한 형식 체계로, 간단히 말해서 이름이 없는 함수 혹은 인라인으로 정의하는 함수로 이해할 수 있다. 수학에서의 람다대수의 정의와 비슷하게 파이썬에서는 다음과 같이 람다함수를 정의한다. lambda {파라미터,…} : {표현식} 람다식은 그 자체로 표현식이며 다음 구성 요소로 작성한다. 키워드 lambda 파라미터 : 컴마로 구분되는 1개 이상의 파라미터. 파라미터는 반드시 1개 이상이어어야 한다. 콜론 : 표현식 : 파라미터와 그외 값으로 이루어지는 일련의 표현식 예를 들어 어떤 파라미터 x 에 대해서 1을 증가시킨 값을 구하는 함수는 람다대수로는 이라고 표현하며,… 더 보기 »람다표현식과 맵, 필터, 리듀스 (Python)

LCD 패널 방식으로 숫자를 표시해보기 (파이썬)

LCD 처럼 숫자를 표시하는 코드를 만들어 보자 크기와 출력할 숫자를 입력받는다. 크기는 LCD 표시 요소 하나의 크기를 가리킨다. (크기는 1~10,  숫자는 0~99,999,999)  가로선은 -, 세로선은 | 문자를 통해서 표현하며, 사이즈만큼 길이가 길어진다. 따라서 하나의 문자를 표시하기 위해서는 가로는 size + 2, 세로는 size * 2 + 3 만큼의 공간이 필요하다. 예시 – 출력: 0123456789. size: 3 — — — — — — — — | | | | | | | | | | | | | | | |… 더 보기 »LCD 패널 방식으로 숫자를 표시해보기 (파이썬)

functional python에 대한 단상

문득, 이런 생각이 들었다. temp = [] for i in range(10):   temp.append(i*i) 이 코드는 10보다 작은 완전제곱수의 리스트를 만드는 함수다. 빈 리스트를 만들고 range() 로 부터 값을 받아 제곱한 다음, 리스트에 넣는다. 이 과정은 파이썬에 익숙한 사람이라면 반복문 보다는 리스트 축약으로 표현할 것이다. temp = [i*i for i in range(10)] 파이썬 리스트 축약의 기본 컨셉은 어떤 연속열로부터 다른 리스트를 만드는 것이고 이것은 람다식을 연속열에 사상(mapping over)하는 것이다.  다른 예로, 사용자로부터 공백으로 구분되는 숫자들을 받아서 정수 리스트를 만들고자 한다면, 공백으로… 더 보기 »functional python에 대한 단상