콘텐츠로 건너뛰기

Python 101 – 함수

프로그래밍에서 함수는 핵심적인 개념이지만, 언어나 상황마다 용어가 다르기도 하고 정의도 모호해서 “함수는 이것이다!”라고 딱 잘라 말하기는 사실 힘듭니다. 위키 백과의 정의만 찾아봐도요.

함수(function), 서브루틴(subroutine), 루틴(routine), 메서드(method), 프로시저(procedure)는 소프트웨어에서 특정 동작을 수행하는 일정 코드 부분을 의미한다.

함수는 대부분의 프로그래밍 언어에서 지원하는 기능으로, 하나의 큰 프로그램을 여러 부분으로 나누어주기 때문에 같은 함수를 여러 상황에서 여러 차례 호출할 수 있으며 일부분을 수정하기 쉽다는 장점을 가진다.

https://ko.wikipedia.org/wiki/함수_(컴퓨터_과학)

가장 넓은 의미에서 함수를 정의하자면 “1개 이상의 동작을 묶어놓은 것”이라고 할 수 있습니다. 즉 일련의 동작을 하나의 단위로 묶어두고, 원하는 만큼 여러 차례 호출하여 사용하는 것이죠. 그렇게해서 전체 코드의 양을 줄일 수 있고, 또 공통된 동작에서 어떤 변경이나 수정이 필요할 때, 소스 코드의 이곳 저곳이 아닌 한 부분만 수정하면 되기 때문에 유지 보수 관점에서도 노력을 아낄 수 있죠.

이미 우리는 파이썬에서 함수를 사용하는 법을 알고 있습니다. 어떤 문자열이나 객체의 내용을 출력하는 print() 나 사용자로부터 문자열을 입력받는 input() 과 같은 동작은 파이썬이 미리 제공하는 함수입니다. 이렇게 별다른 사전 준비 없이 바로 사용할 수 있는, 파이썬이 기본적으로 제공하는 함수를 내장함수(builtin function)라고 합니다. 우리는 내장 함수를 사용하는 것외에 우리가 원하는 동작을 함수로 만들어서 사용할 수도 있습니다. 이런 개념을 내장함수에 상대적인 개념으로 사용자 정의 함수 (user defined function)이라고 합니다.

더 보기 »Python 101 – 함수

윈도 재설치에 대한 기록

코로나로 인해 본격적으로 재택근무를 시작하게 된 재작년에 8년정도 사용한 아이맥이 맛이갔던 관계로 급히 데스크탑 PC를 따로 주문했다. 당시에는 PC 수요가 많아서 한참 PC가격이 오르고 있던 때라, 원격 데스크톱만 구동이 되면 상관없다고 생각해서 가장 저렴한 견적으로 조립했었다. 이때 256MB 용량의 SATA 방식 SSD를 구매했는데, 이것 저것 설치하고 만들고 하다보니 어느덧 70% 정도 용량을 사용했다. 게다가 습관적으로 이걸 다시 5 : 2 정도의 비율로 드라이브 2개로 나눠서 사용하다보니 C드라이브 용량의 압박이 점점 심해졌다.

하여, SSD 증설을 해야겠다고 마음먹고 케이스를 열어보니 NVMe 방식 SSD를 설치할 수 있는 M.2 슬롯이 하나 있는게 아닌가? SATA 드라이브를 하나 더 다는 것 보다는 NVMe 드라이브를 연결하는 것이 더 빠르다는 이야기가 있으니까 이것은 단순히 새 SATA 드라이브를 하나 더 다는 대신 더 빠른 새 디스크에 윈도를 재설치하라는 계시로 받아들일만 했다.(그리고 지금 설치된 윈도는 윈도10으로 설치해서 윈도11으로 업그레이드를 한 것이라, 깔끔하게 새로 설치하고 싶었다. 물론 기존 OS에서 업그레이드했다고 해서 별 문제가 되지는 않는다. 늘 그렇듯이 이런 결정은 그냥 기분 문제이다.)

사실 PC를 포맷하고 재설치하는 일련의 작업들은 컴퓨터를 사용해온 시간이 오래된 만큼, 어느 정도는 익숙한 일이기는 하다. 그래도 또 최근 몇년간은 맥만 사용하다보니 살짝 헤맨 부분도 있고 당시에 뭔가를 선택하면서도 잘 모르겠지만 일단(?) 진행해서 운좋게 성공한 것들이 좀 있어서, 그런 점들을 확인하고 기록해두고 싶어서 재설치 과정을 정리해둔다.

더 보기 »윈도 재설치에 대한 기록

vim에서 설정파일을 메뉴로 열기

개인적으로 vim 설정을 하나의 vimrc 파일에 몰아서 만들기 보다는 여러 개의 파일로 쪼개어 사용자 설정 폴더 내에 배치해두고 사용하고 있다. 그러다보니 특정한 설정을 수정하려 할 때, 해당 파일을 빨리 찾아서 여는 기능이 필요했다. 사용자 정의 Ex 명령으로 만드는 방법이 있지만, Vim8의 팝업 기능을 사용하면 메뉴에서 원하는 파일을 선택해서 여는 기능을 구현할 수 있다.

더 보기 »vim에서 설정파일을 메뉴로 열기

정적/공유 라이브러리 만드는 법

정적 라이브러리 정적 라이브러리는 컴파일된 코드, 즉 오브젝트들의 모음이라고 이해할 수 있다. 컴파일러로 생성한 오브젝트 파일을 ar 명령을 사용해서 하나의 파일로 아카이브를 만들면 정적 라이브러리를 생성할 수 있다. 정적 라이브러리를 사용할 때에는 -L ./ -lmylib 과 같은 식으로 -L, -l 스위치를 사용해서 라이브러리 경로와 파일을 지정하여 컴파일하면 된다. 이렇게 컴파일한 프로그램에는 라이브러리가 실행파일에 통째로 포함되기 때문에 라이브러를 함께 배포할 필요가 없다. (대신 그만큼 실행파일의 크기가 그만큼 커진다.) sqlite3 소스를 받아서 아래와 같은 식으로 정적 라이브러리를 만든 후 실행파일을 만들 수… 더 보기 »정적/공유 라이브러리 만드는 법

Pandas 기초 사용법 – Series

파이썬에서 통계 및 데이터 분석을 위해 사용하는 대표적인 패키지로 pandas를 꼽을 수 있다. 사실 pandas말고 다른 통계용 패키지는 뭐가 있나 잘 모르겠… 통계 분석을 위해서 pandas를 사용하기 위해 파이썬을 배우는 입장이 아니라면 기존의 파이썬 자료 구조와는 사용법이 살짝 다르기 때문에 약간 위화감이 들 수 있다. 이 글에서는 기존 파이썬 자료 구조에 익숙한 사용자가 pandas를 익히기 위해 필요한 내용과 그 사용법을 정리하고자 한다.

Pandas에서는 Series와 DataFrame이라는 두 가지 형식의 데이터 타입이 존재한다. Series는 특정한 기준에 따른 계열 데이터로 파이썬의 리스트와 비슷하다. DataFrame은 Series를 합친 형태로 2차원의 표 형식의 데이터를 다룰 때 사용한다.

더 보기 »Pandas 기초 사용법 – Series

NU Shell에서 여러 인자를 외부 명령에 전달하기

컴파일러 명령과 같이 많은 양의 인자를 전달해야 하는 명령을 Nu shell 스크립트에서 호출할 때, 명령들을 변수에 저장하여 호출하면 하나의 변수가 하나의 인자로 취급되어 예상했던 대로 작동하지 않는 문제가 있다. 예를 들어 vim을 빌드할 때 명령줄에서는 다음과 같이 실행한다. 이 때 각 인자를 하나의 변수에 넣고 실행하면? $build_opt 의 값이 따옴표로 묶인 것처럼 하나의 인자로 전달되어 제대로 컴파일이 되지 않는다. 이 경우에는 문자열 변수를 split row 명령으로 분해하여 파이프를 통해 넘겨준다. $in 은 파이프라인으로 넘겨받은 값을 가리키는 변수로 위와 같은 경우외에… 더 보기 »NU Shell에서 여러 인자를 외부 명령에 전달하기

Ex명령을 반복하기

vim 에서 Ex명령(콜론(:)으로 명령모드로 진입해 실행하는 명령)을 노멀모드에서 반복하려면 @: 을 사용합니다. 한 번 반복한 후에는 @@ 를 사용해서 반복할 수 있습니다. 참고로 변경이나 치환, 삭제등의 편집 명령은 노멀모드에서 . 명령을 통해 반복할 수 있어요. 이러한 반복 명령은 모두 앞에 숫자를 붙여서 한 번에 원하는 횟수만큼 자동으로 반복할 수 있습니다. @는 원래 특정한 레지스터에 들어있는 내용을 자동으로 실행해주는 명령이에요. 보통 q 를 사용해서 매크로를 녹화한 후에 매크로를 실행할 때 사용합니다. 이전 명령을 실행하는 다른 방법으로는 : 키로 명령모드로 전환한 후에… 더 보기 »Ex명령을 반복하기

vim9script 로 autoload 함수 작성하기

vim의 플러그인 스크립트는 런타입 디렉토리 내 plugin 디렉토리 아래에 위치하며, vim이 시작될 때 해당 디렉토리 하위의 모든 vim 파일을 로딩하게 됩니다. 만약 라인 수가 많은 스크립트가 있거나 혹은 읽어들여야 하는 스크립트 파일이 많다면 vim의 초기 시작 시간에 영향을 주게 됩니다. 따라서 많은 플러그인들은 이러한 시작 성능의 영향을 최소화하기 위해서 스크립트의 로딩 시점을 최대한 뒤로 미루는 방법을 적용합니다.

  1. 특정한 타입의 파일을 편집하려할 때 필요한 기능이 있다면 ftplugin 디렉토리 내에 vim 파일을 위치 시킵니다. 여기에 있는 스크립트들은 그 이름과 동일한 타입의 버퍼가 열릴 때 로드됩니다.
  2. 공통적으로 사용하는 함수라면 autoload 디렉토리에 작성합니다. 이 디렉토리에 있는 파일은, 특별한 패턴의 이름으로 함수를 정의하며, 해당 함수가 실제로 호출되기 전까지는 파일이 로드되지 않습니다
더 보기 »vim9script 로 autoload 함수 작성하기

vim에서 여러 파일에 찾기/바꾸기

리눅스 쉘에서, 여러 텍스트 파일의 내용들 중 특정한 단어나 패턴을 찾는데 사용되는 유틸리티인 grep 이라는 프로그램이 있습니다. vim에서도 grep과 같이 여러 파일에서 단어나 패턴을 한꺼번에 찾을 수 있는 기능을 제공합니다. vim의 이러한 기능은 다시 두 가지로 나뉩니다. 첫째로 vim은 그 자체로 grep과 비슷한 기능을 제공하도록 구현되어 있어서 내장된 :vimgrep 이라는 명령을 사용합니다. 이 방식은 vim만 있으면 사용할 수 있고, 플랫폼마다 개행문자가 다르게 쓰이는 부분이나 파일 인코딩을 자동으로 처리해주는 장점이 있습니다만, 속도가 느리다는 단점이 있습니다. 두번째 방법으로는 아예 grep을 사용하여 텍스트를 탐색하고, 그 결과를 vim으로 가져오는 방식이 있습니다. 오늘은 vim에서 grep과 같이 여러 파일에서 텍스트를 검색하고 결과를 사용하는 방법에 대해서 살펴보겠습니다.

더 보기 »vim에서 여러 파일에 찾기/바꾸기

Requests를 사용해서 파일 다운로드 경과를 표시하기

Requests는 파이썬 사용자들이 가장 많이 사용하는 HTTP 통신용 라이브러리일 것이다. 비록 파이썬 표준 라이브러리에 포함되지는 않았지만, 공식 문서에서조차 ‘Requests를 쓰는게 편리하니 추천한다’고 언급할 정도이니… 사실, 파이썬의 역사는 우리의 생각보다 훨씬 오래되었고, 그 와중에 HTTP와 관련된 공식 라이브러리에도 몇 가지 변화가 계속 있어왔다. 최초로 HTTP를 사용하여 데이터를 가져오는 기능은 urllib 에서 구현된 urlopen() 함수였는데, 이 때의 urlopen()은 단순히 open() 함수를 HTTP 너머로 작동하게 하는 것 이상도 이하도 아닌 간단한 구현체였다. HTTP와 관련된 명세는 제법 방대하고 명세 중에서 쓸만한 기능을 제작하기 위해… 더 보기 »Requests를 사용해서 파일 다운로드 경과를 표시하기