C로 작성된 함수를 파이썬에서 사용하기

표준 파이썬 해석기는 C로 만들어져 있다. 그리고 C에는 동적 라이브러리를 링크하여 사용할 수 있는 기능이 마련되어 있다. 따라서 표준 파이썬 해석기를 만드는 사람들도 실행시간에 C로 만들어진 동적 라이브러리를 링크하여 사용할 수 있을 것이라는 생각을 당연히 했을 것이고, 그 결과 ctypes 라는 라이브러리가 탑재되어 있다. 

C로 작성된 함수를 파이썬에서 사용하기 더보기

Swift의 커스텀 타입을 직렬화하기

이 글은 https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types 의 내용을 일부 발췌, 의역한 것입니다.

프로그래밍 분야에서의 많은 작업은 데이터를 디스크에 저장하거나, 네트워크를 통해 전송하거나 API를 호출하기 위해 데이터를 제출하는 등의 일과 관련된다. 이 과정에서 데이터는 전송되는 동안에 적절한 형식으로 인코딩되고 다시 디코딩될 필요가 있다.

Swift의 커스텀 타입을 직렬화하기 더보기

오일러 프로젝트 73

오일러 프로젝트 73번 문제는 기약진분수에 대한 문제이다. 이전 두 문제에서 오일러 피함수와 관계한 기약 진분수의 문제는 악몽과 같은 수행 시간을 보였는데, 이 문제는 그나마 스케일이 조금 작아서 그다지 어렵지 않다.

오일러 프로젝트 73 더보기

파이썬의 숫자판별함수

파이썬에서 주어진 문자열이 숫자로 되어 있는지를 검사하는데에는 흔히 문자열의 메소드인 isdigit()을 사용한다. 그런데 파이썬의 문자열 타입을 조사해보면 같은 기능을 하는 거 같은 메소드가 무려 3종 세트로 알차게 구성되어 있는 것을 알 수 있다. 바로 isdigit(), isnumeric(), isdecimal() 이다. 그렇다면 이 세 가지 함수는 왜 각각 존재하는 것일까?

급한 사람을 위한 빠른 결론 – int 타입으로 안전하게 변환하고 싶다면 isdigit() 대신에 isdecimal()을 사용하여 검사하라

이 세 종류의 메소드는 문자값 중에서 ‘숫자’를 찾는데 사용된다. 우리 말에서 ‘숫자’라는 개념은 사실 모호한데 (응? 이게 왜 모호하다는 거지?) 우리는 일상생활에서 흔히 0, 1, 2, 3, .. , 9의 10개의 숫자를 사용하고 있다. 즉 우리는 10개의 ‘숫자’만을 갖고 있는 셈이다. 그런데 사실은 이게 좀 간단한 문제가 아닌거라는게 문제다.

흔히 사용하는 isdigit() 메소드를 보자. 말 그대로 문자열에 사용된 글자들이 ‘digit’인지를 확인하는 것이다. 아 그러니까 우리는 ‘이게 숫자로 된 문자열이네’라는 것을 알 수 있을 거라 추측한다. 그리고 digit, numeric, decimal은 다같이 ‘숫자’로 번역되기 때문에 이 사이의 차이가 뭔지를 정확하게 모르게 된다.

다시 이번에는 decimal 을 보자. 이것이 우리가 흔히 생각하는 ‘숫자’와 같은 개념이다. 즉 '0123456789'의 구성으로 이루어진 10개의 글자. 말 그대로 int 타입으로 즉시 변환이 가능한 리터럴을 구성하는 문자를 말한다.

아니 그렇다면 digit은 뭐길래? 특수 기호 중에서 어깨위에 제곱이나 세제곱을 표시하는 문자가 있다. digit은 이렇게 ‘숫자처럼 생긴’ 모든 글자를 다 숫자로 치는 것이다. 다음 예를 보면 digit과 decimal의 차이를 알 수 있을 것이다.

x = '3²'
x.isdigit()
# True
x.isdecimal()
# False
int(x)
# ERROR!!!!

위 예에서 볼 수 있는  에서 두 번째 ² 는 특수문자이며, 우리가 흔히 키보드로 입력하는 2와는 다른 코드 값이다. 이는 decimal 값을 표기하는데 사용하는 문자는 아니지만, 사람이 읽었을 때 숫자로 인지하기 때문에 isdecimal()에서는 False가 리턴되고, isdigit()에서는 True가 리턴된다.

따라서 만약 어떤 텍스트가 int 값으로 변환이 가능한지를 검사하고자 한다면 isdigit()을 사용해서는 안되며, isdecimal()을 써야 할 것이다.

그럼 isnumeric()은 어떤 것일까?

numeric 하다는 것은 보다 넓은 의미인데, isdigit()은 단일 글자가 ‘숫자’ 모양으로 생겼으면 True를 리턴한다고 했다. isnumeric()은 숫자값 표현에 해당하는 텍스트까지 인정해준다. 예를 들어 “½” 이런 특수문자도 isnumeric()에서는 True로 판정된다.

Vision을 이용한 얼굴 인식 – 고급편

Vision을 이용해서 이미지 속에서 얼굴을 인식하는 방법을 살펴본 바 있는데, 당시 글에서 VNDetectFaceLandmarksRequest 를 사용했었다. 사실 얼굴이 들어있는 영역만 찾기 위해서는 VNDetectFaceRectsRequest 를 사용하는 것으로도 충분한데, face landmarks를 찾는다는 것은 얼굴의 주요 요소들 – 눈, 코, 입, 윤곽선 등-을 찾아낸다는 의미이다. 

이 글에서는 VNDetectFaceLandmarksRequest를 사용해서 실제로 얼굴의 각 요소를 추적하는 예제를 소개해 보겠다. 

Vision을 이용한 얼굴 인식 – 고급편 더보기