본문 바로가기

반응형

Computer

(114)
파이썬 dataclasses 표준 라이브러리 파이썬 3.7 버젼은 3.x 버젼에서 유독 중요한 변경 사항이 많이 반영된 버젼입니다. 그 중에 특이할 점은 dataclasses 라는 표준 라이브러리가 소개되었다는 점인데요, 저도 최근에야 사용하기 시작했는데, 파이썬 클래스 작성 시 매우 효율적으로 코드를 구성할 수 있어 소개하고자 합니다. 파이썬의 클래스를 선언하려면 __init__ 메소드에 많은 아규먼트를 전달해주어야 하고 아규먼트가 줄거나 늘때마다 __init__ 메소드 안에서 인스턴스 멤버 변수로 선언해주는 코드 또한 매번 작성해야 했습니다. 따라서 __init__ 메소드에 전달해야 하는 아규먼트가 늘어날 수록 불필요한 코드의 양이 증가하게 됩니다. dataclasses 라이브러리를 사용하면 코드를 훨씬 컴팩트하게 작성할 수 있는데요, towa..
정규표현식을 이용해 문자열에서 숫자 찾기 최근에 급히 여러 줄로 이루어진 텍스트로부터 각 줄마다 숫자를 찾아야 할 일이 있었습니다. 텍스트 파일 형식은 xml과 유사한 처음 보는 파일 형식으로 원래는 관련 파이썬 라이브러리 (BeautifulSoup, xml 등등..)를 이용해 해결하고자 했으나 잘 안되더군요. 마음이 급한 와중에 생각한 것이 텍스트 파일의 규격이 일정하기에 정규표현식 (regular expression)을 이용하면 어떨까 생각해서 급히 stack overflow를 뒤져보던 중 다음과 같은 깔끔한 코드 스니펫을 발견했습니다. import re # Format is [(, ), ...] ss = [("apple-12.34 ba33na fanc-14.23e-2yapple+45e5+67.56E+3", ['-12.34', '33', '..
파이썬으로 행렬 구현하기 (4) - 마무리 [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (1) [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (2) [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (3) - 가우스 조던 소거법을 이용한 역행렬 지난 포스트들에서 numpy 라이브러리 없이 순수히 파이썬 문법으로만 행렬을 구현해보았습니다. 먼저, 행과 열이 주어지거나 이중 리스트가 들어왔을 때 행렬을 표현할 수 있도록 클래스를 정의했고 이후에 덧셉, 곱셈, 뺄셈, 역행렬 등의 다양한 행렬 연산을 추가하였습니다. 보통 이런 류의 문제를 내는 코딩테스트에서는 여기서 끝나지 않습니다. 구현한 행렬 클래스를 기반으로 행렬을 이용한 다양한 알고리즘 문제를 서브 문제로 출제하는 경우가 보통입니다. 따라..
파이썬으로 행렬 구현하기 (3) - 가우스 조던 소거법을 이용한 역행렬 [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (1) [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (2) 지난 포스트에서의 행렬 덧셈, 뺄셈, 곱셈에 이어 이번 포스트에서는 행렬의 역변환, 역행렬을 구현해보도록 하겠습니다. 행렬의 행과 열의 크기가 같은 정방행렬의 역행렬을 구하는 방법으로는 대표적으로 가우스-조던 소거법이 있습니다. $AX=I$에서 A의 역행렬 $X$를 구하는 가우스-조던 소거법의 기본은 $AX$를 $IX$로 바꿔주기 위해 1) 행렬의 한 행을 상수배, 2) 행렬의 두 행을 바꿈, 3) 한 행을 상수배하여 다른 행에 더하는 기본 행연산을 수행한다는 것입니다. 행렬의 각 행은 일차방정식이라 볼 수 있고 각 일차방정식을 identity matrix에 ..
파이썬으로 행렬 구현하기 (2) [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (1) 이번 포스트에서는 지난 포스트에서 구현한 행렬 클래스를 기반으로 덧셈, 뺄셈, 곱셈 등의 다양한 행렬 연산을 구현해보도록 하겠습니다. 이때 행렬 클래스끼리 더하거나 곱하는 등의 연산이 가능하도록 언더바 두개로 이루어진 magic method (__magic_method__) 함수를 정의하는 방식으로 구현하도록 하겠습니다. 덧셈과 뺄셈 먼저 덧셈을 구현합니다. 주의 사항으로는 더할 두 행렬의 행과 열의 크기가 같아야하고 만약 정수를 더할 때에는 기존 행렬의 행 혹은 열의 크기가 1일 경우 (벡터의 경우) 모든 원소에 정수를 더하고 행, 열의 크기가 모두 1보다 크다면 대각선 원소만 더한다고 가정합니다. 만약 기존 행렬의 행, 열의 크..
파이썬으로 행렬 구현하기 (1) 코딩테스트의 유형은 회사, 지원직무, 경력에 따라 상이합니다. 일반적으로는 특정 사이트에 접속해서 (프로그래머스, 코드업 등) 주어진 문제를 2~3 시간 내에 풀고 제출하는 경우가 대부분이지만 지원하는 직무가 높은 경력을 요구하거나 일반 알고리즘 문제로 직무 적합성을 판단하기 애매한 경우에는 회사에서 직접 문제를 지원자에게 메일로 보내 푼 문제의 소스코드를 압축파일로 보내라는 경우도 많습니다. 이때의 코딩테스트 문제는 완전 운입니다... 지원하는 팀에서 개발하려고 하는 모듈이 될 수도 있고 (개인적으로 최악의 경우로 요구사항이 높습니다) 머신러닝의 경우 직접 알고리즘를 개발하여 주어진 성능을 달성해야 하는 경우도 있습니다. 이번 포스트에서는 그 중에서도 가장 간단한 numpy 등의 외부 라이브러리 없이 ..
Property와 descriptor (디스크립터) 지난 포스트에서 클래스의 어트리뷰트의 값을 정하고 불러오는 @property와 setter, getter 메소드에 대하여 알아봤습니다. 하지만 @property 데코레이터의 단점으로는 @property가 데코레이션하는 메서드를 같은 클래스에 속하는 여러 애트리뷰트로 사용할 수 없고 서로 무관한 클래스 사이에서 @property 데코레이터를 적용한 메서드를 재사용할 수 없습니다. 예를 들어 학생에게 여러 과목의 시험 성적 점수를 별도로 부여하고 싶다고 합시다. class Exam: def __init__(self): self._writing_grade = 0 self._math_grade = 0 @staticmethod def _check_grade(value): if not (0 >> first_exam..
ModuleNotFoundError 와 ImportError 큰 프로젝트를 구현하다보면 비슷한 기능을 수행하는 클래스와 함수를 별도의 디렉토리, 파일로 refactoring 하고 메인 디렉토리에서 main.py (혹은 test.py)를 수행하게 됩니다. 보통 파이썬 패키지를 구현하면 메인 working directory 에서 소스코드가 담긴 src 디렉토리, 예시가 담긴 examples 디렉토리, 테스트를 위한 tests 디렉토리를 구성하게 되는데요, src 디렉토리 이름을 Figure 1과 같이 working 디렉토리 이름과 같이 정하는 경우도 흔히 있습니다. Figure 1은 HongLearning이란 패키지 예시이고 소스 코드를 HongLearning 디렉토리 안에 구현했다고 가정했을 때의 디렉토리 트리 구조입니다. 현재 current working dire..

반응형