{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "*이 노트북은 제이크 반더플라스(Jake VanderPlas)의 [A Whirlwind Tour of Python](http://www.oreilly.com/programming/free/a-whirlwind-tour-of-python.csp)(OReilly Media, 2016)를 기반으로 만들어졌습니다. 이 내용은 [CC0](https://github.com/jakevdp/WhirlwindTourOfPython/blob/master/LICENSE) 라이센스를 따릅니다. 전체 노트북의 목록은 https://github.com/rickiepark/WhirlwindTourOfPython 에서 볼 수 있습니다.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [제너레이터](12-제너레이터.ipynb) | [목차](목차.ipynb) | [문자열과 정규 표현식](14-문자열 조작과 정규 표현식.ipynb) >" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 모듈과 패키지" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "다양한 작업에 파이썬을 유용하게 만드는 한가지 특징은 \"배터리가 포함되어(battery included)\" 있다는 사실입니다. 즉 파이썬의 표준 라이브러리는 다양한 작업에 유용한 도구들을 포함하고 있습니다.\n", "이 라이브러리 위에 더 특화된 기능을 제공하는 서드파디 도구와 패키지들의 거대 생태계가 구축되어 있습니다.\n", "여기서는 표준 라이브러리 모듈을 임포팅하고 서드파티 모듈을 설치하기 위한 도구와 자신만의 모듈을 만드는 법에 대해 설명하겠습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 모듈 로딩: ``import`` 문\n", "내장 모듈과 서드파티 모듈을 로딩하기 위해 파이썬은 ``import`` 문을 제공합니다.\n", "이 명령을 사용하는 몇 가지 방법이 있는데 권장하는 것과 그렇지 않은 것까지 간단하게 살펴 보겠습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 명시적 모듈 임포팅\n", "명시적으로 모듈을 임포팅하면 모듈의 컨텐츠를 네임스페이스 아래 유지시킵니다.\n", "네임스페이스는 모듈의 내용을 \"``.``\"으로 참조할 수 있습니다.\n", "예를 들어 내장 ``math`` 모듈을 임포트하고 $\\pi$의 코사인 값을 계산합니다:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.0" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import math\n", "math.cos(math.pi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 별칭을 사용한 명시적 모듈 임포팅\n", "모듈 이름이 길면 모듈의 컨텐츠를 사용하기 위해 매번 전체 모듈 이름을 적기 불편합니다.\n", "이런 이유로 보통 \"``import ... as ...``\" 패턴을 사용해 네임스페이스의 짧은 별명을 만듭니다.\n", "예를 들어 데이터 과학 분야에서 유명한 서드파티 패키지인 넘파이(NumPy, Numerical Python)는 관례적으로 ``np`` 별칭을 사용해 임포트합니다:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.0" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "np.cos(np.pi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 명시적 모듈 컨텐츠 임포팅\n", "때로는 모듈 네임스페이스를 임포팅하는 것대신 모듈에서 몇 개의 컨텐츠만 임포팅하고 싶을 수 있습니다.\n", "이럴 때는 \"``from ... import ...``\" 패턴을 사용합니다.\n", "예를 들어, ``math`` 모듈에서 ``cos`` 함수와 ``pi`` 상수만을 임포트할 수 있습니다:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from math import cos, pi\n", "cos(pi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 모듈 컨텐츠 묵시적 임포팅\n", "마지막으로 가끔 모듈 컨텐츠 전체를 로컬 네임스페이스로 임포팅하는게 편리할 때가 있습니다.\n", "이런 경우에는 \"``from ... import *``\" 패턴을 사용합니다:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from math import *\n", "sin(pi) ** 2 + cos(pi) ** 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이 패턴은 사용한다고 해도 삼가해서 사용해야 합니다.\n", "이런 임포팅은 이따금 원치 않게 함수 이름을 덮어 쓸 수 있고 묵시적인 임포팅은 무엇이 바뀌었는지 찾기 어려운 문제가 있습니다.\n", "\n", "예를 들어 파이썬은 여러 연산에 사용할 수 있는 ``sum`` 함수가 있습니다:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on built-in function sum in module builtins:\n", "\n", "sum(iterable, start=0, /)\n", " Return the sum of a 'start' value (default: 0) plus an iterable of numbers\n", " \n", " When the iterable is empty, return the start value.\n", " This function is intended specifically for use with numeric values and may\n", " reject non-numeric types.\n", "\n" ] } ], "source": [ "help(sum)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이 함수를 사용해 특정 값에서 시작하는 시퀀스의 합을 계산할 수 있습니다(``-1``에서부터 시작해 보겠습니다):" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(range(5), -1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이제 ``numpy``에서 ``*``를 임포팅하고 *같은 함수 이름*이 겹칠 때 어떤 일이 생기는지 보겠습니다:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "from numpy import *" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(range(5), -1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "결괏값이 1만큼 커졌습니다!\n", "이런 이유는 ``import *`` 문장이 내장 ``sum`` 함수를 ``numpy.sum`` 함수로 바꾸었기 때문입니다. 두 함수는 다르며 전자는 ``-1``부터 시작해 ``range(5)``를 더하지만, 후자는 마지막 축(``-1``의 의미)을 따라 ``range(5)``를 더합니다.\n", "이것이 \"``import *``\"를 사용했을 때 조심하지 않으면 일어날 수 있는 상황입니다. 그래서 작업에 대해 정확히 알고 있지 않다면 이런 방식은 피하는 것이 좋습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 파이썬 표준 라이브러리 임포팅\n", "\n", "파이썬의 표준 라이브러리는 많은 내장 모듈을 담고 있으며 [파이썬 문서](https://docs.python.org/ko/3/library/)에서 전체를 볼 수 있습니다.\n", "이들은 모두 ``import`` 문으로 임포팅할 수 있고 이전 섹션에서처럼 도움말 함수를 사용해 살펴 볼 수 있습니다.\n", "둘러 보고 익혀둘만한 극히 일부 모듈을 다음에 나열하였습니다:\n", "\n", "- ``os``와 ``sys``: 파일 디렉토리 구조의 탐색과 쉘 명령 실행을 포함한 운영체제 시스템과의 인터페이싱 도구\n", "- ``math``와 ``cmath``: 실수와 복소수에 대한 수학 함수와 연산들\n", "- ``itertools``: 반복자와 제너레이터를 만들고 다루기 위한 도구들\n", "- ``functools``: 함수형 프로그래밍을 지원하기 위한 도구들\n", "- ``random``: 유사 난수 생성을 위한 도구들\n", "- ``pickle``: 객체를 저장하고 디스크에서 로딩하는 등의 객체 지속성을 위한 도구들\n", "- ``json``과 ``csv``: JSON과 CSV 포맷의 파일을 읽기 위한 도구들\n", "- ``urllib``: HTTP와 다른 웹 요청을 위한 도구들\n", "\n", "이런 모듈의 설명과 다른 많은 것들을 파이썬 표준 라이브러리 문서에서 볼 수 있습니다: https://docs.python.org/ko/3/library/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 서드파티 모듈 임포팅\n", "\n", "파이썬을 데이터 과학 세계에서 특히 유용하게 만드는 한 가지는 서드파티 생태계입니다.\n", "이 모듈들은 내장 모듈처럼 임포팅할 수 있지만 먼저 모듈을 시스템에 설치해야 합니다.\n", "이런 모듈의 표준 저장소는 파이썬 패키지 인덱스(줄여서 *PyPI*)로 웹 주소는 http://pypi.python.org/ 입니다.\n", "편리하게 파이썬은 PyPI에 있는 패키지를 추출하여 자동으로 설치하는 ``pip``(재귀적 약어인 \"pip installs packages\"를 의미합니다) 프로그램을 기본으로 제공합니다(만약 파이썬 버전 2를 사용하면 ``pip``를 별도로 설치해야 합니다).\n", "예를 들어 제가 만든 ``supersmoother`` 패키지를 설치하려면 다음과 같은 명령을 입력하는 것이 전부입니다:\n", "```\n", "$ pip install supersmoother\n", "```\n", "이 패키지의 소스 코드가 자동으로 PyPI 저장소에서 다운로드되고 기본 파이썬 경로에 설치됩니다(이 컴퓨터에서 적절한 권한이 있다고 가정합니다).\n", "\n", "PyPI와 ``pip`` 인스톨러에 대해 더 알고 싶다면 http://pypi.python.org/ 문서를 참고하세요." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [제너레이터](12-제너레이터.ipynb) | [목차](목차.ipynb) | [문자열과 정규 표현식](14-문자열과 정규 표현식.ipynb) >" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "TensorFlow 2.3 on Python 3.6 (CUDA 10.1)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 1 }