콘텐츠로 건너뛰기
Home » 파이썬 » Page 7

파이썬

오일러 프로젝트 009

둘레의 길이가 1000이고 각 변의 길이가 자연수인 직각삼각형 찾기 세 자연수 a, b, c 가 피타고라스 정리 를 만족하면 피타고라스 수라고 부릅니다 (여기서 ). 예를 들면 이므로 3, 4, 5는 피타고라스 수입니다. a + b + c = 1000 인 피타고라스 수 a, b, c는 한 가지 뿐입니다. 이 때, a × b × c 는 얼마입니까? 삼각형의 세 변의 길이를 짧은 것 부터 a, b, c 라하자. ( ) 이 때 a 가 가장 커질 수 있는 경우는 ,… 더 보기 »오일러 프로젝트 009

오일러 프로젝트 08

접근 리스트 내 임의의 위치에서부터 연속한 5개의 값을 얻고, 이 수들의 누적곱을 구할 수 있으면, 0부터 955 사이의 위치에 대해 이 계산을 적용한 후 최대값을 구하면 된다. 리스트를 xs라 하고, 특정한 위치 pos에서 다섯 개의 연속한 원소를 구하기 위해서는 슬라이싱 문법을 사용할 수 있다. 누적곱은 루프를 돌면서 곱해도 되고, reduce() 함수를 사용해서 리스트를 접어서 만들수도 있다.

파이썬에서 제네릭 함수 정의하기 – singledispatch

어떤 하나의 함수 (혹은 겉으로 보기에 이름이 다른 여러 다른 함수)가 여러 타입의 인자를 받고, 인자의 타입에 따라 적절한 동작을 하는 함수를 제네릭 함수라고 한다. C++이나 Swift에 이런 제네릭 관련 기능이 언어 레벨에서 지원되는데, 사실 파이썬은 동적 타입 언어이기 때문에 언어수준의 명시적인 제네릭 지원 기능은 없다.1 파이썬의 제네릭 비록 파이썬이 동적 타입 언어이기는 하지만, 파이썬 내에는 제네릭과 비슷한 함수들이 있다. 기본 함수 중 len() 함수는 리스트, 집합, 사전, 문자열 등 타입에 대해 객체의 길이값을 구할 수 있다. 이 때 길이는 구하는 방법은… 더 보기 »파이썬에서 제네릭 함수 정의하기 – singledispatch

괄호를 처리할 수 있는 사칙연산 계산기 (Python)

파이썬으로 간단한 사칙연산 계산기를 만들어보자. 실질적으로는 간단한 계산을 명령줄에서 수행할 수 있는 계산기가 필요해서 (계산기 앱을 실행하는게 귀찮…) 만들어보기로 했다.

실질적으로 간단한 덧셈, 나눗셈이 아니라, 다항식을 계산하고, 괄호가 들어있는 수식을 계산하는 기능이 필요했다. 따라서입력 자체는 명령줄 인자로 받으며, 가능한 한 ‘관대하게’ 처리하고자 했다.

이를 위해서는 입력받은 식을 공백이나 연산기호를 구분점으로 파싱하고, 후위식으로 변환한 후 이 후위식을 하나의 항으로 계산한 다음, 그 결과를 출력해주면 된다. 이들 각각의 과정을 함수로 만들고 최종적으로 하나의 코드로 조립해나간다.

더 보기 »괄호를 처리할 수 있는 사칙연산 계산기 (Python)

argparse – Python 명령줄도구의 인자분석

케이스별 실제 사용 예 위주로 정리한 새 글이 있으니 참고하세요.

argparse

https://docs.python.org/3/library/argparse.html?highlight=argparse#module-argparse

CLI툴을 만들 때 다양한 옵션 스위치들을 제공하려는 경우, 이를 일일이 파싱1하는 것은 사실 쉽지 않다.파이썬에서는 argparse 모듈이 이러한 작업을 보다 편하게 할 수 있게 도와준다. 더 보기 »argparse – Python 명령줄도구의 인자분석

오일러 프로젝트 02

오일러 프로젝트의 두 번째 문제는 4백만 이하의 피보나치 수열 중에서 짝수인 항을 모두 더한 합을 구하는 문제이다.

피보나치 수열의 각 항은 바로 앞의 항 두 개를 더한 것이 됩니다. 1과 2로 시작하는 경우 이 수열은 아래와 같습니다
. ( 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... )
 
짝수이면서 4백만 이하인 모든 항을 더하면 얼마가 됩니까?

더 보기 »오일러 프로젝트 02

파이썬의 새로운 병렬처리 API – Concurrent.futures

컴퓨터 프로그램이 어떤 일을 처리해 나가는 실행 흐름은 기본적으로 선형이다. 서브루틴을 실행하는 것은 실질적으로 현재의 실행흐름이 해당 루틴의 단계까지 내려갔다가 다시 복귀하는 것이며, 하나의 CPU는 마치 고속도로에서 차선을 바꿔타듯 코드를 진행하며 작업을 처리해나간다. 하지만 두 개의 차선에서 동시에 다른 작업이 진행되어야 하는 상황이 언젠가는 필요할 수 있을 것이다.

이전에는 이것을 ‘동시성’이라 불렀고, 파이썬에서는 기본적으로 threading.ThreadMultiprocessing.Process 를 이용해서 다중 스레드 및 다중 프로세스를 통해서 동시성 작업을 처리했다. 이들 라이브러리 이전에 _thread 라는 저수준 API가 존재했었지만, 지금은 잊어도 좋을 것 같다.

파이썬 3.2에서는 ‘동시성’에 관한 개념을 발전시킨 고수준 API를 제공하여 더 나은 형태의 코드를 작성할 수 있게끔해주는데, 그것이 바로 오늘 소개할 concurrent.futures 라이브러리이다.

이 새로운 API는 기존의 멀티스레드 관련 API를 완전히 대체하지는 않는다. concurrent 모듈은 여전히 내부적으로 _thread와 같은 기존 API에 의존하고 있는 것도 사실이며, 스레드나 프로세스를 저수준에서 세세하게 제어하는 수단을 모두 제공하지도 않는다.

다만 주목할 것은 자바스크립트의 Promise 개념과 비슷한 Future라는 개념을 도입했고, 결과적으로 분산처리 및 그외 동시성에 관련된 코드를 좀 더 편하게 작성할 수 있게 해준다.

더 보기 »파이썬의 새로운 병렬처리 API – Concurrent.futures

체를 사용하여 소수 집합 구하기

가장 빠른 알고리듬 현재까지 순수 파이썬으로 작성된 알고리듬 중 가장 빠른 것으로 알려진 것은 @Robert William Hanks가 개발한 아래 알고리듬이다. def primes(n): """Return a list of primes under n""" sieve = [True] * (n/2) for i in xrange(3, int(n**0.5)+1, 2): if sieve[i/2]: sieve[i*i/2::i] = [False] * ((n-i*i-1)/(2*i)+1) return [2] + [2*i+1 for i in xrange(1, n/2) if sieve[i]]

Task, Future, Coroutine

코루틴과 Task에 대한 내용을 발행했었는데 이 부분은 사실 asyncio에 대한 총정리 글에 포함되는 내용이었던 관계로, asyncio 에서 사용되는 세 가지 대기 가능 객체인 Task, Future, Coroutine 의 차이에 대해서 설명하는 내용으로 수정합니다.


asyncio는 비동기 처리를 위해 비동기 코루틴을 만들고 이를 스케줄링하여 실행하는 기능을 중심으로 구성되어 있다. 그런데 관련 함수를 찾아보면 어떤 것은 코루틴, 또 어떤 것은 Task나 Future로 표현하며 섞어 쓰는 것 같기도 해서 혼란스러운 점이 있다. 이 글에서는 코루틴과 asyncio.Task, asyncio.Future 가 각각 어떻게 다른지 살펴보도록 하겠다.

더 보기 »Task, Future, Coroutine

병합정렬

병합정렬은 기초적인 정렬 알고리듬 중에서 널리 알려진 알고리듬 중 하나이며, 대표적인 분정복 알고리듬의 예인 동시에 재귀 알고리듬의 좋은 예이다. 이름에 ‘병합'(merge)이 들어가는 이유는 배열을 2개 혹은 그 이상의 작은 조각으로 나누고 각각의 조각을 정렬한 다음, 각 조각의 앞에서부터 가장 작은 값을 순서대로 골라서 정렬된 결과를 생성하기 때문이다.

원래의 배열을 쪼갠 각각의 조각 역시 똑같은 병합 정렬을 이용해서 정렬하는 재귀적인 동작을 수행한다. 재귀적 알고리듬의 수행 과정을 복잡하고 어렵게 여기는 사람들이 있는데, 입력과 결과에 집중하는 방식으로 바라보면 오히려 더욱 명료하고 간단하다는 것을 알 수 있다.

더 보기 »병합정렬