{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "***\n", "# 18. 모듈의 활용 및 패키지\n", "***\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 1 모듈의 다양한 import 방법\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-1 모듈 import 하기\n", "#### 1) import 모듈명\n", "- 가장 기본적인 형태\n", " - 현재의 이름 공간에 mymath 이름이 유지되므로 mymath.area() 형태로 자격 이름 사용" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "78.5\n" ] } ], "source": [ "import mymath\n", "print(mymath.area(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2) from 모듈명 import 이름들\n", "- 해당 모듈에 존재하는 지정 이름들을 현재 이름 공간으로 불러들인다.\n", "- 불러들인 각 이름들은 모듈 이름 없이 직접 사용 가능하다.\n", "- import 하는 이름들이 기존에 미리 존재하고 있었다면 그 이름들에 의해 참조되던 기존 객체들은 상실된다." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "78.5\n" ] } ], "source": [ "from mymath import area, mypi\n", "print(area(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3) from 모듈명 import *\n", "- 해당 모듈에 존재하는 '\\_\\_'로 시작되는 이름들을 제외한 모든 이름들을 현재 이름 공간으로 불러들인다. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "78.5\n" ] } ], "source": [ "from mymath import *\n", "print(area(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4) import 모듈명 as 새로운 모듈 이름\n", "- 해당 모듈을 새로운 다른 이름으로 사용하고자 할 때 사용\n", "- 기존 모듈 이름이 너무 길거나 현재 사용중인 다름 이름들과 충돌이 일어날 때 유용" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n" ] } ], "source": [ "import string as chstr\n", "print(chstr)\n", "print()\n", "print(chstr.punctuation)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5) from 모듈명 import 이름 as 새로운 이름[, 이름 as 새로운 이름]\n", "- 해당 모듈 내에 정의된 이름을 다른 새로운 이름으로 사용하고자 할 때 사용" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n" ] } ], "source": [ "from string import punctuation\n", "print(punctuation)\n", "from string import punctuation as punc\n", "print(punc)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "4\n", "\n", "5\n", "\n", "4\n", "5\n" ] } ], "source": [ "from math import floor as flr, ceil as cil\n", "print(flr)\n", "print(flr(4.5))\n", "print(cil)\n", "print(cil(4.5))\n", "\n", "print()\n", "\n", "from math import floor, ceil\n", "print(floor(4.5))\n", "print(ceil(4.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- import 문은 보통의 문(statement)이 작성될 수 있는 곳이면 어디에서나 사용 가능\n", " - 예를 들면 함수 정의 def 문 안이나 if 문 안에서 사용할 수 있음" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def str_test(s):\n", " import string\n", " t = string.split(s)\n", " return(t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-2 import에 의한 모듈 코드 수행\n", "- import는 코드를 가져오기만 하는 것이 아니라 가져온 코드를 수행한다." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "50.24\n" ] } ], "source": [ "#FILE : mymath.py\n", "mypi = 3.14\n", "\n", "def add(a, b):\n", " return a + b\n", "\n", "def area(r):\n", " return mypi * r * r\n", "\n", "print(area(4.0))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import mymath\n", "\n", "#기존:\n", "#50.24" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-3 컴파일과 적재시간\n", "- import mymath를 수행할 때 발생하는 일\n", " - 1) 우선 mymath.pyc를 찾는다.\n", " - 2) mymath.pyc가 없다면 mymath.py를 찾아서 mymath.pyc를 생성한다.\n", " - 3) 생성된 mymath.pyc를 메모리로 읽어들여 수행한다.\n", "- .pyc 파일\n", " - 바이트 코드 파일\n", " - 기계나 플랫폼(OS)에 의존하지 않도록 만들어진 일종의 목적 코드 (Object Code)\n", " - 파이썬은 컴파일 언어이면서 동시에 인터프리터 언어의 수행 방식을 취하고 있다.\n", "- 새로운 .pyc 생성에 대한 판단\n", " - .py 수정 시간이 .pyc 수정 시간보다 더 최근일 때\n", "- .py가 없이도 .pyc 파일만 있어도 import 가능\n", " - 코드를 숨기는 간단한 기법으로 활용 가능" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-4 모듈 이름과 이미 사용하고 있던 이름이 같다면?\n", "- 이전의 이름이 참조하던 객체는 상실됨" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "string = \"My first string\"\n", "import string\n", "print(string)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "My first string\n" ] } ], "source": [ "import string\n", "string = \"My first string\" #여기서 string이란 이름은 문자열을 참조하게 된다.\n", "print(string)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 한번 import 되었던 모듈은 메모리에 적재되어지고, 나중에 다시 동일한 모듈을 import하면 메모리에 적재되어 있던 모듈이 즉시 사용된다." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "My first string\n", "1\n" ] } ], "source": [ "import string\n", "string.a = 1\n", "string = \"My first string\"\n", "print(string)\n", "\n", "import string\n", "print(string.a) # 여기서 string 모듈이 기존에 이미 등록되었던 것임을 알 수 있다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 2 모듈의 실행과 테스트 코드\n", "***\n", "- \\_\\_name\\_\\_\n", " - 모듈의 이름이 자동으로 저장되는 변수\n", " - 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해 import되어 수행되는지를 구별하기 위해 주로 활용\n", " - 최상위 모듈: 파이썬 인터프리터가 기본적으로 가장 먼저 인식하여 처리하는 모듈\n", " - 모듈의 이름이 항상 \"\\_\\_main\\_\\_\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- prname.py를 직접 수행할 때의 출력 내용: \\_\\_main\\_\\_\n", " - \\>\\>\\> ipython prname.py\n", " - \\_\\_main\\_\\_\n", " - prname.py가 최상위 모듈로서 수행됨을 의미" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__main__\n" ] } ], "source": [ "#FILE : prname.py\n", "print(__name__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- prname.py가 모듈로서 다른 이름 공간으로 import 되어질 때의 출력 내용: prname" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prname\n" ] } ], "source": [ "import prname\n", "print(prname.__name__)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "string\n", "re\n", "os\n" ] } ], "source": [ "import string\n", "print(string.__name__)\n", "\n", "import re\n", "print(re.__name__)\n", "\n", "import os\n", "print(os.__name__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 아래 코드는 최상위 모듈로서 수행될 때 add() 함수 호출이 일어난다. \n", "- 보통 파이썬 모듈을 개발할 때에는 마지막 부분에 if \\_\\_name\\_\\_ == \"\\_\\_main\\_\\_\": 과 같은 코드를 추가하여 테스트 코드를 삽입한다." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "11\n", "Python is becoming popular.\n" ] } ], "source": [ "#file: module_test.py\n", "def add(a, b):\n", " return a + b\n", "\n", "def f():\n", " print(\"Python is becoming popular.\")\n", "\n", "if __name__ == \"__main__\":\n", " print(add(1, 10))\n", " f()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 정의된 모듈이 다른 모듈로 import되어질 때에는 \\_\\_name\\_\\_은 모듈 이름 자체이므로 위 코드에서 if 문이 수행되지 않는다. \n", " - 즉, test() 함수 호출이 곧바로 되지 않는다." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import module_test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 3 패키지\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3-1 패키지의 이해" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 패키지 (Package)\n", " - 여러 모듈들을 한데 묶어서 정리해 놓은 구조\n", " - 물리적으로 여러 모듈 파일을 모아 놓은 디렉토리에 해당\n", " - 최상위 디렉토리 이름이 패키지 이름이 된다.\n", " - 최상위 디렉토리 하위에 여러 서브 디렉토리는 해당 최상위 패키지의 하위 패키지가 된다. \n", "- 예제: Speech 패키지\n", " - 각 폴더마다 \\_\\_init\\_\\_.py 파일 존재에 유의\n", " - 패키지가 임포트 되면 \\_\\_init\\_\\_.py 파일에 존재하는 내용은 자동으로 실행됨" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![inheritance](../images/package.png)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import Speech" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Speech 디렉토리의 위치\n", " - sys.path(또는 PYTHONPATH 환경 변수)에 열거된 폴더 중 하나에 위치해야 한다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Speech/Recognition/HMM.py 코드 내용" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def train():\n", " print(\"Train\")\n", " pass\n", "\n", "def loadModel():\n", " print(\"LoadModel\")\n", " pass\n", "\n", "def saveModel():\n", " print(\"SaveModel\")\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3-2 \\_\\_init\\_\\_.py의 역할\n", "- \\_\\_init\\_\\_.py 파일이 존재해야지만 파이썬 패키지로서 인식됨" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3-3 import 하기" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import Speech" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train\n" ] } ], "source": [ "Speech.Recognition.HMM.train()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train\n" ] } ], "source": [ "import Speech.Recognition.HMM\n", "Speech.Recognition.HMM.train()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train\n" ] } ], "source": [ "from Speech.Recognition import HMM\n", "HMM.train()" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train\n" ] } ], "source": [ "from Speech.Recognition.HMM import train\n", "train()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3-4 import * 하기" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train\n", "LoadModel\n", "SaveModel\n" ] } ], "source": [ "from Speech.Recognition.HMM import *\n", "train()\n", "loadModel()\n", "saveModel()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8" } }, "nbformat": 4, "nbformat_minor": 1 }