<jupyter_start><jupyter_text>****** 18. 모듈의 활용 및 패키지****** *** 1 모듈의 다양한 import 방법***  1-1 모듈 import 하기 1) import 모듈명- 가장 기본적인 형태  - 현재의 이름 공간에 mymath 이름이 유지되므로 mymath.area() 형태로 자격 이름 사용<jupyter_code>import mymath
print(mymath.area(5))<jupyter_output>78.5<jupyter_text>2) from 모듈명 import 이름들- 해당 모듈에 존재하는 지정 이름들을 현재 이름 공간으로 불러들인다.- 불러들인 각 이름들은 모듈 이름 없이 직접 사용 가능하다.- import 하는 이름들이 기존에 미리 존재하고 있었다면 그 이름들에 의해 참조되던 기존 객체들은 상실된다.<jupyter_code>from mymath import area, mypi
print(area(5))<jupyter_output>78.5<jupyter_text>3) from 모듈명 import *- 해당 모듈에 존재하는 '\_\_'로 시작되는 이름들을 제외한 모든 이름들을 현재 이름 공간으로 불러들인다.<jupyter_code>from mymath import *
print(area(5))<jupyter_output>78.5<jupyter_text>4) import 모듈명 as 새로운 모듈 이름- 해당 모듈을 새로운 다른 이름으로 사용하고자 할 때 사용- 기존 모듈 이름이 너무 길거나 현재 사용중인 다름 이름들과 충돌이 일어날 때 유용<jupyter_code>import string as chstr
print(chstr)
print()
print(chstr.punctuation)<jupyter_output><module 'string' from '/Users/yhhan/anaconda3/lib/python3.6/string.py'>

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~<jupyter_text>5) from 모듈명 import 이름 as 새로운 이름[, 이름 as 새로운 이름]- 해당 모듈 내에 정의된 이름을 다른 새로운 이름으로 사용하고자 할 때 사용<jupyter_code>from string import punctuation
print(punctuation)
from string import punctuation as punc
print(punc)
from math import floor as flr, ceil as cil
print(flr)
print(flr(4.5))
print(cil)
print(cil(4.5))

print()

from math import floor, ceil
print(floor(4.5))
print(ceil(4.5))<jupyter_output><built-in function floor>
4
<built-in function ceil>
5

4
5<jupyter_text>- import 문은 보통의 문(statement)이 작성될 수 있는 곳이면 어디에서나 사용 가능  - 예를 들면 함수 정의 def 문 안이나 if 문 안에서 사용할 수 있음<jupyter_code>def str_test(s):
    import string
    t = string.split(s)
    return(t)<jupyter_output><empty_output><jupyter_text>1-2 import에 의한 모듈 코드 수행- import는 코드를 가져오기만 하는 것이 아니라 가져온 코드를 수행한다.<jupyter_code>#FILE : mymath.py
mypi = 3.14

def add(a, b):
    return a + b

def area(r):
    return mypi * r * r

print(area(4.0))
import mymath

#기존:
#50.24<jupyter_output><empty_output><jupyter_text>1-3 컴파일과 적재시간- import mymath를 수행할 때 발생하는 일  - 1) 우선 mymath.pyc를 찾는다.  - 2) mymath.pyc가 없다면 mymath.py를 찾아서 mymath.pyc를 생성한다.  - 3) 생성된 mymath.pyc를 메모리로 읽어들여 수행한다.- .pyc 파일  - 바이트 코드 파일    - 기계나 플랫폼(OS)에 의존하지 않도록 만들어진 일종의 목적 코드 (Object Code)    - 파이썬은 컴파일 언어이면서 동시에 인터프리터 언어의 수행 방식을 취하고 있다.- 새로운 .pyc 생성에 대한 판단  - .py 수정 시간이 .pyc 수정 시간보다 더 최근일 때- .py가 없이도 .pyc 파일만 있어도 import 가능  - 코드를 숨기는 간단한 기법으로 활용 가능  1-4 모듈 이름과 이미 사용하고 있던 이름이 같다면?- 이전의 이름이 참조하던 객체는 상실됨<jupyter_code>string = "My first string"
import string
print(string)
import string
string = "My first string" #여기서 string이란 이름은 문자열을 참조하게 된다.
print(string)<jupyter_output>My first string<jupyter_text>- 한번 import 되었던 모듈은 메모리에 적재되어지고, 나중에 다시 동일한 모듈을 import하면 메모리에 적재되어 있던 모듈이 즉시 사용된다.<jupyter_code>import string
string.a = 1
string = "My first string"
print(string)

import string
print(string.a)  # 여기서 string 모듈이 기존에 이미 등록되었던 것임을 알 수 있다.<jupyter_output>My first string
1<jupyter_text>*** 2 모듈의 실행과 테스트 코드***- \_\_name\_\_  - 모듈의 이름이 자동으로 저장되는 변수  - 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해 import되어 수행되는지를 구별하기 위해 주로 활용  - 최상위 모듈: 파이썬 인터프리터가 기본적으로 가장 먼저 인식하여 처리하는 모듈     - 모듈의 이름이 항상 "\_\_main\_\_" - prname.py를 직접 수행할 때의 출력 내용: \_\_main\_\_  - \>\>\> ipython prname.py    - \_\_main\_\_  - prname.py가 최상위 모듈로서 수행됨을 의미<jupyter_code>#FILE : prname.py
print(__name__)<jupyter_output>__main__<jupyter_text>- prname.py가 모듈로서 다른 이름 공간으로 import 되어질 때의 출력 내용: prname<jupyter_code>import prname
print(prname.__name__)
import string
print(string.__name__)

import re
print(re.__name__)

import os
print(os.__name__)<jupyter_output>string
re
os<jupyter_text>- 아래 코드는 최상위 모듈로서 수행될 때 add() 함수 호출이 일어난다. - 보통 파이썬 모듈을 개발할 때에는 마지막 부분에 if \_\_name\_\_ == "\_\_main\_\_": 과 같은 코드를 추가하여 테스트 코드를 삽입한다.<jupyter_code>#file: module_test.py
def add(a, b):
    return a + b

def f():
    print("Python is becoming popular.")

if __name__ == "__main__":
    print(add(1, 10))
    f()<jupyter_output>11
Python is becoming popular.<jupyter_text>- 정의된 모듈이 다른 모듈로 import되어질 때에는 \_\_name\_\_은 모듈 이름 자체이므로 위 코드에서 if 문이 수행되지 않는다.   - 즉, test() 함수 호출이 곧바로 되지 않는다.<jupyter_code>import module_test<jupyter_output><empty_output><jupyter_text>*** 3 패키지***  3-1 패키지의 이해 - 패키지 (Package)  - 여러 모듈들을 한데 묶어서 정리해 놓은 구조  - 물리적으로 여러 모듈 파일을 모아 놓은 디렉토리에 해당    - 최상위 디렉토리 이름이 패키지 이름이 된다.    - 최상위 디렉토리 하위에 여러 서브 디렉토리는 해당 최상위 패키지의 하위 패키지가 된다. - 예제: Speech 패키지  - 각 폴더마다 \_\_init\_\_.py 파일 존재에 유의  - 패키지가 임포트 되면 \_\_init\_\_.py 파일에 존재하는 내용은 자동으로 실행됨 ![inheritance](../images/package.png)<jupyter_code>import Speech<jupyter_output><empty_output><jupyter_text>- Speech 디렉토리의 위치  - sys.path(또는 PYTHONPATH 환경 변수)에 열거된 폴더 중 하나에 위치해야 한다. - Speech/Recognition/HMM.py 코드 내용<jupyter_code>def train():
    print("Train")
    pass

def loadModel():
    print("LoadModel")
    pass

def saveModel():
    print("SaveModel")
    pass<jupyter_output><empty_output><jupyter_text>3-2 \_\_init\_\_.py의 역할- \_\_init\_\_.py 파일이 존재해야지만 파이썬 패키지로서 인식됨  3-3 import 하기<jupyter_code>import Speech
Speech.Recognition.HMM.train()
import Speech.Recognition.HMM
Speech.Recognition.HMM.train()
from Speech.Recognition import HMM
HMM.train()
from Speech.Recognition.HMM import train
train()<jupyter_output>Train<jupyter_text>3-4 import * 하기<jupyter_code>from Speech.Recognition.HMM import *
train()
loadModel()
saveModel()<jupyter_output>Train
LoadModel
SaveModel
{'fraction_non_alphanumeric': 0.1160377358490566, 'fraction_numerical': 0.013584905660377358, 'mean_word_length': 3.9588400374181476, 'pattern_counts': {'":': 2, '<': 61, '<?xml version=': 0, '>': 64, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '172717', 'license': 'MIT', 'n_tokens_mistral': 3309, 'n_tokens_neox': 3931, 'n_words': 689, 'path': 'python3.6/.ipynb_checkpoints/python18-checkpoint.ipynb', 'repo_name': 'gjbr5/python-link-e-learning', 'size': '5300'}