Python 소수 판정


기존 보다 빠르게 소수 판정을 해주는 코드, Project Euler 진행에 있어서 유용하다.


PyCharm을 활용한 파이썬 개발환경 구축

1. Python 다운로드 및 설치

- PyCharm IDE 설치에 앞서 파이썬을 먼저 설치해준다. Python 공식 다운로드 페이지에서 각자 머신에 맞는 릴리즈 및 버전으로 다운받아 설치한다.


2. PyCharm IDE 다운로드 및 설치

- 위에서 Python을 정상적으로 설치한 후에 JetBrain 홈페이지에서 PyCharm을 다운로드 받고 설치해주자. Community 버전이 무료로 제공되는 버전이다.


3. PyCharm 다운 및 설치

- PyCharm 설치가 완료 후, 실행해보자. 그러면 몇 가지 설정을 위한 선택사항이 나오는데 기본값으로 OK 또는 Accept을 눌러서 실행하자. 모든 설정을 마친 후 나오는 화면은 아래와 같다.

4. 프로젝트 생성 및 실행

- Python과 PyCharm이 설치되었다면, 간단한 프로젝트를 생성하고 실행함으로써 정상적으로 동작하는 지 확인하자. 아래는 간단한 'Hello World!'를 작성하고 실행시킨 결과화면이다.




0. 개요


지난 시간에 다뤘던 [Python 강의] Dataset 조작하기 (1/2)에 이어서 이번에도 데이터-셋을 가지고 장난을 쳐보자. 이전에 사용했던 뉴욕시 택시정보에 대한 축약된 데이터-셋을 이용할 요량이니, 데이터를 삭제하거나 다운로드 받지 않았다면 링크된 이전 강의를 참고하면 되겠다.



1. 준비


일단 데이터를 만지작(?)하기 전에 필요한 라이브러리를 import하고, 데이터를 읽어서 변수에 할당해놓은 작업을 선행하자.



이번에도 마찬가지로 빠른 연산을 도와주는 numpy와 데이터 처리에 필요한 pandas, 그리고 가시적인 그래프로 데이터를 표현해줄 matplotlib를 import 시켰다. 또한 변수 data, fare에 각각 파일을 읽어서 할당해주었다. 현재 필요한 라이브러리는 모두 추가했다. 진행 중에 추가적으로 다른 라이브러리가 필요할 경우 그 때 삽입해줘도 괜찮으니 진행해보자.



2. 원하는 데이터만 뽑아서 보기


변수 data, fare에 저장된 데이터-셋은 꽤 크기가 크고 14개의 열을 가지고 있기 때문에 한 눈에 파악하기도 힘들 뿐더러, 필요없는 정보를 많이 포함하고 있다. 이번에는 택시를 이용한 승객이 이동한 거리 및 이동시간에 초점을 맞춰 데이터를 각색해보자.



데이터의 특정 열만 추려서 보고 싶다면 data[['trip_distance', 'trip_time_in_secs']]처럼 대괄호 안에 원하는 열의 이름을 기재하면 된다. 첫 번째로 승객의 이동 거리와 이동시간만 추려서 최초의 3개의 열을 보여주고 있다. 다음은 레코드의 정보를 자세히 보고 싶을 경우 loc 명령어를 통해 해당 레코드의 정보를 볼 수 있다. 자세히 살펴보면 data.loc[0]의 결과와 data.head(1)의 출력의 형태만 가로/세로로 다를 뿐이지 내용은 동일한 것을 알아챌 수 있다.



3. 인터렉티브하게 데이터 조작하기


이전 강의인 [Python 강의] Jupyter/IPython의 유용한 기능에서 다뤘던 Interactive Widgets를 이용하여 실시간으로 반영되도록 데이터를 조작할 수 있다. 앞서 import 했던 라이브러리와 별개로 새로운 라이브러리가 필요하므로 다시 import 해주자.



위에서 선언한 함수는 데이터-셋의 이동거리가 기준값(distance_threshold)보다 큰 레코드의 개수를 반환한다. 생성된 위젯을 마우스로 이리저리 옮겨보면, 그에 따라서 기준값이 변하고 덩달아 조건을 만족하는 레코드의 수가 변하는 것을 확인할 수 있다.



4. 새로운 열 추가 및 숫자 연산


데이터-셋에 기존에 없던 열을 새로이 추가할 수 있다. 또한 그 추가한 열에 기존의 데이터를 가공하여 채워줄 수 있는데 다음 코드를 보자.

data['trip_time_in_mins'] = data.trip_time_in_secs / 60.0


이 코드를 보면 'trip_time_in_mins'로 이동에 걸린 시간을 분 단위로 표현하는 열을 추가하고 있다. 이 열을 채워넣기 위해 기존에 있던 'trip_time_in_secs'를 60으로 나눗셈하고 있다. 아래의 화면은 전체 데이터 중에서 trip_time_in_secs, trip_time_in_mins만 추려서 최초 3개의 레코드만 출력하여 결과를 확인하고 있다.



또한 데이터를 열 단위 뿐만아니라 행 단위로도 추려서 볼 수 있다. 아래의 화면은 특정 열의 특정 행만 출력하고 있다. 즉 행과 열로 모두 축약되었다.



데이터-셋의 열 중에서 [이동 거리]열의 [0부터 5까지]의 행을 변수 a에 할당하고 있으며, [이동 거리]열의 [2부터 6까지]의 행을 변수 b에 할당하고 있다. 재밌는 점은 이렇게 추출한 데이터도 순서를 유지하고 있기 떄문에 덧셈(+) 연산의 결과 공통된 행끼리는 가능하지만 동일한 행이 아닐 경우에는 NaN(Not a Number)로 표기되는 것을 확인할 수 있다.



5. 각종 함수


이밖에도 데이터-셋을 조작하는데 기본적으로 제공되는 함수 몇 가지를 정리해보자. 우선 dayofweek는 datetime 형식의 데이터를 받아서 해당 날짜의 요일을 반환해준다. 변수 data에 할당된 데이터의 'pickup_datetime'열을 이용하여 승객이 탑승한 요일을 알아보면 다음과 같다.



[ : : 200000]으로 범위를 지정해줘서 200,000 번 간격으로 레코드를 출력하게 했다. 이렇게 처리하지 않으면 처음 데이터는 모두 결과가 1로 출력된다. (같은 날의 데이터들이 앞쪽에 몰려있기 때문이다.) 보면 0부터 6까지 총 7개의 숫자로 요일을 표기하고 있다.


다음은 'pickup_datetime'과 'dropoff_datetime'의 날짜만 비교(시간은 무시하고) 해보자. 이를 통해서 저녁 늦게 택시를 타서 다음 날이 되서야 내린 승객을 파악할 수 있다. 아니면 정말 택시를 오래타서 다음 날 하차한 승객일수도있다. 


코드의 아웃풋 최초 10개를 출력해보면 실제로 승차한 날은 1월 1일인데, 하차일은 모두 1월 2일임을 알 수 있다. 이처럼 기본적으로 제공하는 함수를 이용하면 기존의 데이터-셋을 가지고 다양한 정보를 추출해낼 수 있다.



6. 마치며...


[Python 강의] Dataset 조작하기 (1/2)에 이어서 두 번째로 데이터 처리에 관한 글을 게시했다. 이전에 글은 그래프를 그리면서 가시적으로 결과물을 보기에 흥미로웠던 부분이 있었다면, 이번 강의는 보다 실용적인 부분에 초점이 맞춰진 것 같다. 어떻게 생각하면, 데이터를 시각화하는 것은 데이터가 정립된 이후의 작업이기 때문에 이번 포스팅에서 다뤘던 내용을 선행한 후에 이전 강의를 다루는 편이 더 나을것 같다.







0. 준비


파이썬에서 기본적으로 데이터를 처리(읽거나 저장하거나 다른 형태로 재배열하는 등...)하는 프로세스는 대부분 Pandas를 이용한다. 쉽게 생각하면 Pandas로 읽어들인 데이터들을 빠르게 연산하기 위해 numpy를 사용한다고 보면 된다. 이번 시간에는 Pandas를 이용해서 '뉴욕시 택시'에 관련된 데이터-셋을 직접 다뤄볼 예정이다. 진행에 앞서 가볍게 데이터-셋를 다운받도록 하자. 실제적인 데이터는 17GB에 육박하지만 실습을 위해서는 테스트용으로 축소 제작된 80MB 정도의 작은 데이터-셋를 이용한다. 리눅스나 맥OS 환경에서 데이터-셋을 다운로드 하기위해서 명령어를 이용하면 되지만, 윈도우 환경에서는 불가하므로 웹 브라우저의 URL에 아래를 입력하도록 하자.

https://raw.githubusercontent.com/ipython-books/minibook-2nd-data/master/nyc_taxi.zip


다운로드가 완료되면 적당한 위치에 압축을 해제하고, 쥬피터 환경에서 새 파이썬 문서를 생성해주자.



1. Data read


먼저 데이터를 읽어오자. 데이터를 처리하기 위해서는 해당 데이터를 읽어서 변수에 저장하는 것이 선행되어야 한다. 데이터를 정상적으로 읽어오기 위해서는 자신이 압축을 해제했던 위치를 기억해두는 것이 좋다. 아래의 화면을 보면서 중요한 내용들을 짚어보자.



일단 기본적으로 numpy와 pandas를 사용하기 위해서 import 해주도록 하자. 또한 추후에 사용할 파이썬 내에서 그래프를 그려주기 위해서 matplotlib 역시 import 해주고, 문서 내에서 아웃풋을 확인하기 위해서 inline으로 설정해준다. 그리고 각각 변수 data_filename과 fare_filename에 읽어올 데이터의 위치를 입력하고, pandas에서제공하는 함수 read_csv를 통해 csv 문서를 data, fare 변수에 저장하도록 한다. 정상적으로 저장되었는지 확인을 위해서 data.head() 함수를 통해 처음 다섯 개의 레코드만 출력해보자.



2. 데이터 조작


조작이라고 하니 뭔가 부정적인 느낌이 들지만, 그냥 있는 데이터가지고 만지작해보자는 얘기다. 긍정적으로는 기존의 데이터를 토대로 의미있는 데이터를 추출해볼 수도 있다. 먼저, 변수 data에 저장된 데이터-셋의 열을 출력해보면 다음과 같은 열을 가지고 있는 것을 알 수 있다.



위의 열들을 각각 따로 저장하고, 일정 수식처리를 하는 함수를 제작했다. 함수 내부에 있는 연산은 [탑승 위치의 경도/위도]와 [하차 위치의 경도/위도]를 통해 이동한 거리를 계산한 것이 아닌가 예상해본다.



함수의 리턴값은 튜플인데 파이썬에서는 튜플을 한 번에 두 개의 변수에 할당할 수 있다. px, py에 동시에 할당한 후 정상적으로 할당되었는지 px를 출력해보자. 아래와 같은 화면이 나온다면 px에 데이터-셋의 일부가 제대로 할당되었음을 알 수 있다.




3. 데이터 시각화


pandas를 가지고 처리한 데이터를 그래프를 통해서 시각해보자. 이를 위해서 필요한 것이 위에서 import했던 matplotlib다. 일단 matplotlib가 제공하는 간단한 함수를 통해서 데이터-셋의 산포도를 확인해보자.

plt.scatter(px, py)



위에서 조작했던 데이터를 할당받은 px, py를 인수로 넣었더니 아래와 같은 산포도를 제공해준다. 왼쪽 상단의 점들이 집중된 점을 자세히 보기 위해서 아래의 조건으로 다시 산포도를 그려보자.



각 라인에서 크기, 점의 크기 및 투명도, 축의 이름, x축의 범위, y축의 범위, 축을 제거하고 있다. 이처럼 축소해서 보면 데이터가 나타내는 정보를 보다 명확하게 이해할 수 있다. 재미있는 점은 위의 그래프가 우리가 조작했던 데이터를 통해 얻은 산포도 그래프인데 이것이 뉴욕의 특정 지역의 지도와 유사한 것을 볼 수 있다.


위의 그래프와 구글 지도의 뉴욕시티를 비교해보면 가운데 분홍색으로 표시된 지역인 맨하튼에 지형과 거의 일치하는 것을 알 수 있다. 이를 통해서 대부분 택시 이용이 맨하튼에서 이뤄지는 것을 알 수 있는 것이다. 간단한 예지만 이처럼 데이터-셋을 통해서는 알 수 없었던 정보를 새롭게 추출할 수 있다는 점이 흥미롭다.


이밖에도 기본적인 함수를 통해서 데이터가 가지고 있는 특징들을 추려낼 수 있다. count, min, max, mean, median 등의 함수들은 전체 데이터-셋에서 레코드의 수, 최대/최소 등의 정보를 반환해준다. 이번에는 조작한 데이터를 토대로 히스토그램을 제작해보자. 먼저 보다 깔끔한 그래프를 그리기 위해서 seaborn을 설치하자. 설치하지 않아도 히스토그램을 출력할 수 있지만 설치하는 편이 가독성이 눈에 띄게 좋다.



seaborn 설치 후 아래의 명령어를 입력하면 px에 대한 히스토그램을 출력해준다. 필자는 이미 seaborn을 설치하고 import한 상태에서 진행해서 아래와 같은 그래프를 얻었다. seaborn을 import하기 이전에도 히스토그램은 생성이 가능하니, 보다 구린(?) 히스토그램을 이용하길 원한다면 seaborn을 이용하지 않으면 된다.

data.trip_distance.hist(bins=np.linspace(0., 10., 100))




4. 마치며...


pandas를 이용하여 csv 형식의 데이터를 읽어오고, numpy를 이용하여 데이터를 조작하고, matplotlib을 이용하여 조작된 데이터를 토대로 그래프를 생성했다. 또한 seaborn을 이용하여 생성한 데이터 그래프의 가독성을 높여줄 수 있었다. 이 모든 과정이 하나의 파이썬 문서 내에서 진행됐다는 점이 쥬피터 환경의 돋보이는 장점이자 흥미로운 점이다. 






0. 개요


파이썬 개발을 위해서 굳이 쥬피터를 사용하지 않아도 상관없다. 오히려 웹 상에서 개발이 진행되기 때문에 불편한 점이 많은 것이 사실이다. 예를 들어, 다른 IDE 툴에서 유용하게 사용하는 [ctrl + z]가 쥬피터에서는 유용하지 않다. 또한 동일한 단어를 찾아서 모두 교체하는 기능 역시 웹 상에서 동작하지 않기 때문에 불편하다. 그렇다면 쥬피터를 사용해서 얻을 수 있는 장점은 무엇이 있을까? 파이썬 강의 첫 번째 글에 작성한 것 처럼 하나의 문서내에 그래프, 인풋, 아웃풋, 노트 등의 기능을 모두 담을 수 있다는 점이 가장 큰 장점이다. 오늘 강의는 그런 쥬피터 환경이 가지고 있는 이점을 최대한 정리하려한다.



1. Magic Command


쥬피터 환경에서 제공하는 매직 커맨드는 수십가지가 있다. 이들 모두를 다룰 것은 아니고 눈에 띄는 몇 가지 명령어만 다뤄 볼 참이다. 기본적으로 리눅스 쉘에서 사용하는 명령어들이 몇몇 제공되고 있다. 간단히 확인해 볼 명령어는 ls 명령어와 pwd 명령어다. 리눅스 쉘에서 자주 사용하는 명령어며, 내용이 특히 간단하다. 매직 커맨드 목록을 보기 위해 아래의 명령어를 입력하자.

%lsmagic


매직 커맨드는 앞에 % 문자를 기본적으로 붙여주며, 이어서 ls 명령어와 pwd 명령어를 실행한 결과를 확인할 수 있다.


필자가 조금 더 인상깊었던 매직 커맨드는 %timeit 이라는 커맨드인데 이는 코드의 수행시간을 알려준다. 단순히 한 번 동작한 시간을 알려주는 것이 아니라 수 백, 수 천번 이상을 수행한 뒤 평균적인 시간을 출력해준다는 점이 특징이다. 수행 시간이 상당히 긴 코드의 경우 적게 반복하고, 수행 시간이 짧은 코드의 경우 수 만번 이상 반복하여 평균한 시간을 알려준다. 코드의 수행시간에 따라서 상당히 유연하게 동작하는 것을 알 수 있다. 지난 시간에 만들었던 리스트의 모든 요소들을 제곱하는 함수의 수행 시간을 알아보자.



List Comprehension으로 반복문을 구동한 시간을 알아봤다. 내용을 보면 간단한 코드인만큼 1,000,000 번 반복해서 가장 느렸던 시간과 함께 1회 반복마다 걸린 시간을 알 수 있다. 성능을 비교할 때 유용한 명령어이므로 기억해두자.



2. Interactive Widgets


쥬피터의 가장 큰 장점을 확인할 수 있는 부분인데, 인터렉티브한 문서를 작성가능하다는 점이다. 하나의 문서내에 유투브 영상 및 파라미터를 인터렉티브하게 조절할 수 있는 바를 제작해보자. 먼저 유투브 영상을 문서에 포함하기 위해서는 아래처럼 유투브 비디오를 import 해줘야한다.

from Ipython.display import YouTubeVideo

YouTubeVideo('j9YpkSX7NNM')


위 코드의 첫 번째라인에서 유투브 비디오를 import하고 있고, 두 번째 라인에서 유투브 영상을 삽입하고 있다. 괄호안에 j9YpkSX7NNM 는 유투브 영상주소에 포함되어 있는 고유값으로 해당 값을 입력해주면 정상적으로 문서에 해당 영상을 포함시킬 수 있다.



이어서 볼 위젯은 인터렉티브하게 값을 변경할 수 있는 Bar 기능이다. 이 역시 import 과정이 필요하다. 코드를 통해 확인해보면 다음과 같다.

from ipywidgets import interact

@interact(x=(0, 10))

def square(x):

return ("The square of %d is %d.", % (x, x**2))


위 코드 첫 번째 라인에서는 필요한 부분을 import하고 있고, 두 번째 라인에서 square 함수에 인수로 전달되는 x의 값을 0에서부터 10까지 조절할 수 있도록 위젯를 형성하고 있다. 코드를 수행한 결과 아래의 화면을 보면 가로로 긴 Bar가 생긴 것을 확인할 수 있다.


비록 사진에서는 멈춰있지만 실제로 마우스를 통해 바를 움직여보면 그에 따라서 출력되는 값이 실시간으로 변하는 것을 확인할 수 있다. 



3. 마치며...


오늘 알아본 매직 커맨드와 인터렉티브 위젯들은 Jupyter/IPython 환경에서 제공하는 다양한 내용 중에 극히 일부에 불과하다. 제공하고 있는 많은 매직 커맨드를 경험해보고, 본 글에서 다루지 않았던 다양한 위젯을 응용해 본다면 더욱 매력적인 문서를 작성할 수 있을 것이다. 더불어 디버깅 툴처럼 개발자들이 유용하게 사용할 수 있는 기능을 제공하니 참고하여 효율적으로 활용하도록 하자.




0. 개요


이전까지 아나콘다, 쥬피터 상에서 파이썬 3.5 버전을 다룰 수 있도록 환경을 세팅했다. 오늘 포스팅은 파이썬 문법 중 기억할만한 것들에 대해서 간략하게 정리해볼까 한다. 세팅했던 환경을 이용하기 위해서 쥬피터 노트북을 실행해보자. 이전 포스팅에서 다뤘던 것처럼 윈도우 환경에서는 파워쉘을 실행시켜 jupyter notebook 명령어를 입력하거나, 탐색기에서 Jupyter Notebook을 검색하여 실행하면 된다. 그러면 아래처럼 웹 브라우저가 시행될 것인데 여기서 몇 가지 파이썬 문법을 직접 수행하면서 알아볼 참이다. 상당히 기본적으로 치부되는 문법들은 과감하게 생략하고, 정리가 필요한 내용만 포스팅할 예정이므로 기본적인 문법을 위해서는 다음을 참조하는 편이 유익할 것이다.


열린 브라우저 창에서 우측 상단에 있는 [New] 버튼을 클릭하여 연습할 파이썬 파일을 생성해주자. 필자는 파일명을 Memorable로 정했다. 지난 시간에 개발 환경이 적절하게 설치되었는지 확인해보기 위해 다시 한 번 Hello World를 출력해봤다. 정상적으로 동작하는 것을 확인했으며, 이제부터 정리가 필요한 내용들을 하나씩 알아보자.


1. 리스트(List)


파이썬에서 유용하게 쓰이는 자료구조 중에 리스트가 있는데, 특징이 남달라서 정리 해볼만하다. 필자가 처음 파이썬을 접했을 때에는 리스트 = 배열인줄 알았다. 그러나 유사한 면이 있는 것은 맞지만 엄밀히 말하면 둘은 다르다. Java 혹은 C언어에서 다루는 배열은 동일한 타입만 요소로 다뤄질 수 있었는데 리스트는 서로 다른 타입의 데이터도 다룰 수 있다는 점이 가장 큰 차이다. 


1.1 리스트의 환형구조


리스트를 배열처럼 선언하여 사용하다보면 재미난 점이 있는데, 음수 인덱스를 이용한 접근이 가능하다는 점이다. 예시를 보면 금방 이해가 될 내용이다.




화면을 확인하면 알 수 있듯이 리스트는 [A, B, C, D, E]로 구성되어있는데 items[-1]로 접근하면 E를 출력하고, items[-2]로 접근하면 D를 출력하는 것을 확인할 수 있다. 0 번째 아이템이 A임을 감안하면 -1 번째 E, -2 번째 D가 나오는 것을 이해할 수 있는데 이는 곧 리스트의 구조가 환형(Circular)임을 파악할 수 있다. 이 부분을 잘 기억한다면 번잡한 함수-콜 없이 접근을 자유롭게 할 수 있을 것 같다.


1.2 slice


리스트를 일정 범위만큼 자르기 위해서 사용하는 방법이다. 대부분 언어에서는 이 기능을 함수나 메소드로 구현하고 있지만 파이썬에서는 인덱스에 특별한 입력을 통해 잘린 리스트를 반환할 수 있다.



items[1:3]으로 배열을 접근하여, 출력된 결과를 보면 B와 C가 출력된 것을 알 수 있다. 언뜻보면 '인덱스 1을 포함하고, 인덱스 3을 포함하지 않는 범위까지'라고 애매하게 이해될 수 있다. 필자도 이 부분이 항상 체계적이지 못하다고 생각했지만 수강했던 강의에서 확실하게 이해할 수 있었다. 위 인덱스의 내용 [1:3]이 의미하는 바를 다음처럼 기억하자. 

"리스트 요소(element) 사이사이를 지칭하는 인덱스 "


위 리스트의 요소 사이사이는 다음처럼 표현할 수 있다. [ ^ A ^ B ^ C ^ D ^ E ^ ]. 바로 ^로 표현한 사이사이를 지칭하는 것이 바로 [1:3]인 것이다. 1이 의미하는 것은 [A 뒤, B 앞]의 ^이고(왜냐하면 인덱스는 0부터 시작하니까), 3이 의미하는 것은 [C 뒤, D 앞]의 ^이다. 이 두 인덱스 사이를 출력해보면 결과적으로 B, C가 출력되는 것을 파악할 수 있다. 어려운 내용은 아니지만 기억하기에는 헷갈릴만한 내용이므로 정리해봤다.


1.3 List Comprehension


가장 기억 해야할만한 내용으로 리스트 전체에 대해 일괄적으로 동일한 작업을 반복하는 명령어다. 웹 프로그래밍할 때 자바스크립트 언어에서 동일한 기능이 있었지만 파이썬과는 문법이 사뭇 달랐다. 아래의 화면을 통해 이해해보자.



List Comprehension 확인을 위해서 이전에 선언했던 리스트를 [A. B, C ,D ,E] → [1, 2, 3, 4, 5]로 변경했다. 그리고 그 다음 라인을 통해 리스트 내에 모든 요소들에게 동일한 명령어를 수행하고 있다.

[temp * temp for temp in items]

 

위 명령어를 풀어서 설명하자면 items 리스트 안에 있는 모든 요소를 제곱하라는 의미다. 출력된 결과를 보면 [1, 4, 9, 16, 25]로 모든 요소가 제곱된 것을 확인할 수 있다. 강사님의 말로는 해당 명령어를 통해 구현한 반복문이 다른 언어에서 쓰이는 전형적인 for문, while문보다 빠른 속도를 제공한다고 한다. 내부적으로 어떤 원리인지는 모르겠지만 파이썬을 배우는 과정에서 기억할만한 내용이다.


2. 함수


이전까지 기본 문법은 생략하고, 그나마 리스트가 가진 특징에 대해서만 언급했는데 함수에 대해서도 정리하고 넘어가야할 내용이 있어 정리해본다. 파이썬의 함수는 임의의 갯수의 인수를 수용할 수 있다. 이를 Positional Arguments라 칭하고, 또한 이미 정의된 인수도 수용할 수 있는데 이를 Keyword Arguments라 한다. 이들에 대해서만 간단히 정리해보자.


2.1 Positional & Keyword Arguments


위에서 Positional Arguments와 Keyword Arguments에 대한 설명을 했으니 화면을 통해 실제적으로 어떻게 사용되는지 확인해보자.



첫 번째로 remainder 함수를 선언했다. remainder 함수는 숫자를 하나 입력받으면 미리 설정된 인수(Keyword Arguments)로 나누는 간단한 함수다. remainder(5)의 결과가 1 임을 확인할 수 있고, 그 바로 아랫 라인에서는 (5, 3)을 인수로 전달하여 number = 5, divisor = 3으로 대입된 것을 확인할 수 있다. 실제로 remainder(5, 3)과 remainder(5, divisor = 3)은 정확하게 일치하지만 코드 분석이나 가독성을 위해서 후자를 이용하는 것이 바람직하다. remainder 함수를 통해 Keyword Arguments에 대해서 알아봤다면 f 함수를 통해 둘 다 명확하게 알아보자. f 함수는 인수로 Positional Arguments와 Keyword Arguments를 받고 있다. 따라서 f(1, 2, c = 3, d = 4)를 출력해보면  Positional Arguments로 입력된 1, 2가 튜플의 자료구조 형태로 출력되는 것을 알 수 있고, Keyword Arguments로 입력된 c, d가 딕셔너리의 자료구조 형태로 출력되는 것을 확인할 수 있다.



오늘 알아본 것을 사람들이 이해하기 쉽게, 그리고 훗날 내용을 까먹을 내가 더 잘 리마인드 할 수 있도록 포스팅을 했지만 실제로 다룬 내용을 보면 참 부실하다. 강의를 진행하면 할수록 더 다룰 내용이 풍성해 지겠지만, 기본 문법을 생략에 생략을 거듭하다보니 정작 다룬 것은 아래 내용이 전부다.




3. 마치며...


개요에서 언급한 것처럼 언어를 시작할 때는 가장 기본적인 문법부터 익히는 것이 바람직할 것이다. 그러나 필자는 다양한 언어를 경험해봤기 때문에 기초적이고 다른 언어와 공통점이 많은 문법들은 따로 정리할 필요가 없다. 때문에 기본적인 문법을 익히기 위해서는 다음을 참조하길 추천한다. 필자가 학습한 내용 중에 기억할 필요한 내용을 추려서 정리하기 때문에 좋은 참고자료가 되긴 어렵겠지만, 나와 비슷한 수준을 지닌 사람들에게 도움이 되길 기대해본다.













파이썬은 1991년 Guido Van Rossum이 퍼블리싱한 언어로 인터프리터로 해석되는 스크립트 언어다. 필자는 Matlab, C, Python 중에 하나의 강의를 수강하게 되었는데 웹에 대해서 공부할 때 스크립트 언어에 대해 재미있게 학습한 기억이 있고, 연구실에서도 파이썬을 수강할 것을 추천했기에 파이썬을 선택했다. 강의의 초반부에는 재미있는 얘기를 접할 수 있었는데, 파이썬이 공식적으로 퍼블리싱되던 91년 즈음에는 현재 학생들이 자신만의 모바일 애플리케이션을 제작하는 것처럼 직접 스크립트 언어를 제작하는 것이 유행이었다고 한다. 때문에 비슷한 시기에 다양한 스크립트 언어가 발매되었다고 한다. 비록 지금까지 살아남은 것은 드물지만.


현재 다양한 연구실과 산업분야에서 비싼 값을 치루면서까지 Matlab이 사용되고 있다. 그러나 프로그래밍 언어론적인 측면에서 매틀랩은 파이썬에 비하면 상당히 낮은 수준의 언어라고 한다. 한 때 객체지향 패러다임의 유행으로 산업계에 cpp가 투입됐었지만, 그 동안 유지해 온 절자지향적인 사고방식을 객체지향적인 패러다임으로 전환하는 것이 실패했고, 그 틈새시장을 매틀랩이 차지하게 되었다는 후문이다.


다양한 단점에도 불구하고 인정할 수 밖에 없는 매틀랩의 장점은 계산과 코멘트, 그래프 및 특수문자 삽입이 하나의 파일내에서 작업가능하다는 점이다. 코딩은 IDE에서, 그래프 작업은 웹에서, 문서작업은 워드에서 등 하나의 논문이나 문서를 작성할 때 병행해야 하던 것을 대부분 매틀랩 내에서 처리할 수 있었기 때문에 작업 사이의 동기가 잘 맞는다는 것이다.



매틀랩과 관련된 얘기로 인해 서두가 길었다. 앞으로 주로 사용하게 될 파이썬에 대해서 좀 더 자세히 알아보자. 위에 있는 표는 프로그래밍 언어의 트렌드를 조사한 것인데, 한 동안 꾸준히 성장세를 보이던 자바가 주춤하고, 파이썬이 2위에 위치한 것과 비교적 최근 발매된 스위프트라는 언어가 급상승 중이라는 것을 알 수 있다. 위 표를 통해 앞으로 학습할 파이썬이라는 언어가 상당히 긍정적으로 평가되고 있다는 것을 기억하자.


Pros & Cons


하지만 장점으로 꼽았던 모든 기능들을 최근에는 파이썬에서 처리가능하다. 그리고 덧 붙여 파이썬이 가지고 있는 가장 큰 장점은 쉽다는 점이다. 자바스크립트처럼 타입에도 유연하고, 제공하는 라이브러리도 다양하고 많다. 비록 이전까진 싱글코어 환경으로 제한되어 쉽지만 느린 랭귀지란 생각이 있었는데, 이마저도 최근에는 많이 개선되었다고 한다.


현재 2.7버전과 3.5버전이 있는데, 대게 언어는 점진적으로 개선을 거듭하여 발전하는 법이지만 파이썬은 조금 다르다. 2.7버전과 3.5버전 둘 다 계속 개발중에 있으며, 현재까지는 2.7 버전 사용이 조금 우세하거나 비등한 수준일 것이다. 그도 그럴만한 것이, 파이썬이 가지고 있는 한계점을 대폭 개선하기위해 하위 호환을 적극적으로 고려하지 않고 3.5버전을 출시했다. 때문에 3.5버전 퍼블리싱 당시에는 옹호하지 않는 의견도 다분히 많았다고 한다. 하지만 점차 3.5의 비중이 증가하면서 미래에는 파이썬 버전 3.5가 리드할 것으로 예상한다.


또한 주목 할 만한 점은 최근 프로그래밍 언어들의 추세에 맞게 파이썬 역시 멀티-패러다임을 지원한다. 즉 파이썬 내에서 object-oriented, imperative, functional, procedural, reflective 형식의 프로그래밍이 가능하다는 것이다.

 



1. 개발 환경 설정


파이썬에 대해서 간단히 알아봤으니 이제 실질적으로 프로그래밍 할 수 있는 환경을 구축해보자. 필자는 수강하고 있는 강의 내용과 동일한 개발 환경을 구축할 것이다. 파이썬 버전 3.5를 사용하며, 파이썬 언어를 지원하는 웹 애플리케이션 주피터(Jupyter)를 사용할 것이다. 또한 대학원에서 자주 접할 수학, 공학, 데이터 분석에 최적화 된 파이썬 배포판인 (아나콘다)Anaconda를 사용할 것이다. 아마도 이름을 아나콘다로 작명한 것은 파이썬이 비단뱀을 의미하기 때문일 것이다. 그럼 아나콘다 웹 페이지로 이동하여 자신의 운영체제에 맞는 버전으로 설치해주자. 필자는 윈도우 환경에서 작업하므로 윈도우 64-bit 버전을 사용할 것이다.



2. 주피터 사용


아나콘다 설치가 완료되었다면, 윈도우 기준으로 윈도우 파워쉘(Windows PowerShell)을 켜주자. 일반적인 CMD 창에서는 명령어가 정상적으로 동작하지 않는다고 하니 반드시 파워쉘을 사용 해야한다. 파워쉘에서 아래의 명령어를 입력하면 로컬 서버가 설정되고 웹 환경에서 파이썬 프로그래밍을 진행할 수 있게 된다.

$ jupyter notebook


명령어를 입력하면 자동으로 웹 브라우저가 실행되며, 파워쉘 창은 끄지 말고 내려두자. 만약 종료하면 서버 역시 종료되어 웹에서 작업을 이어갈 수 없다. 또한 파워쉘에서 직접 명령어를 입력할 필요 없이 jupyter notebook이라는 파일을 실행해줘도 동일하다. 정상적으로 실행하면 아래와 같은 파워쉘 화면을 확인할 수 있다.



그리고 자동으로 실행된 웹 브라우저를 확인해보면 쥬피터가 구동 중이라는 것을 파악할 수 있다. 본격적인 프로그래밍은 웹 브라우저 상에서 진행된다.





Github를 사용해 본 사람에게는 매우 익숙한 UI이기 때문에 사용에 크게 어려움은 없을 것 같다. 만약 익숙하지 않더라도, 상당히 직관적이며 실제 윈도우나 리눅스의 디렉토리 구조도 동일하므로 금새 적응할 수 있다. 우측 위에 [New] 버튼을 통해 폴더를 생성할 수 있고, Python3 파일을 생성할 수 있다. 필자는 /Desktop/python 폴더를 생성하고, 그 안에 intro.ipynb 파일을 생성했다. 아마 쥬피터에서 작업하면 확장자가 ipynb로 지정되는 것 같다. 파일이 실행되고 나서 위에 메뉴바를 보면 파일 이름을 변경할 수 있고, 쥬피터 로고 옆에 파일 이름을 클릭해도 이름을 변경할 수 있다. 






Intro라는 파일 제목에 걸맞게 Hello world!를 출력해보고, 정상적으로 출력이 된다면 파이썬 프로그래밍을 위한 개발환경은 구축되었다고 볼 수 있다. 가볍게 아래의 명령어를 입력하고 [Shift + Enter]를 눌러서 정상적으로 출력되는지 확인해보자.

print ("Hello world!")



위의 사진을 확인해보면 검은색 글씨로 출력된 것을 알 수 있다. 이번 포스팅은 여기서 마치지만, 실질적인 파이썬 프로그래밍은 이제부터 시작이다. 개발환경이 이전과 상이하게 다른 만큼 개발 환경인 쥬피터의 기능에 대해서 알아봐야하고, 이어서 파이썬 문법과 기능에 대해서도 알아봐야 한다. 앞으로 적어도 30시간 동안은 꾸준히 사용할 개발 환경인만큼 'h'를 눌러서 쥬피터가 갖고 있는 기능에 대해서라도 한 번 훑어보는 편이 좋을 것이다.



3. 마치며...


필자도 짧게나마 파이썬 프로그래밍을 해 본 경험이 있지만, 쥬피터나 아나콘다 환경은 처음 접해 봤다. 물론 처음이라 낯선 면도 있고, 다른 IDE에 비해서 매우 불편한 것처럼 느껴지지만 최근에는 웹 상에서 이와 같은 작업을 많이 하는 트렌드같다. 한 번은 경험해볼만하고, 익숙해진다면 나쁘지 않을 것 같다. 앞으로 진행될 30시간의 강의동안 최대한 능숙하게 다루기 위해서는 빨리 적응해나갈 필요가 있다.