Media Log

1. 모듈(Module)

 

이번에는 모듈(Module)에 대해서 알아보도록 하겠습니다. 파이썬에서의 모듈이란 변수, 클래스, 함수 등과 같은 여러 코드를 한곳에 모아놓은 코드의 모음이라고 할 수 있습니다. 이런 모듈이라는 것을 만들어 놓으면 계속 사용할 수 있으므로 코드의 재사용성을 극대화 시킬 수 있으며, 연관성이 있는 것들을 모듈 단위로 분리하여 효율성을 높일 수 있습니다. 모듈의 장점에 대해서는 차차 알아가보도록 하고, 먼저 모듈을 불러오는 방법부터 알아보도록 하겠습니다. 이 모듈이라는 것을 가져오려면 'import'라는 키워드를 통해 모듈을 불러올 수 있습니다. 아래와 같이 말입니다.

import 모듈명

우리가 직접 모듈을 만들어 보기 전에, 파이썬에 기본으로 내장된 모듈을 불러와, 그 모듈의 기능을 한번 이용해보도록 합시다. 한번, math라는 내장 모듈을 불러와서 dir 함수를 아래와 같이 사용해보세요.

>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

위와 같이 math라는 내장 모듈을 불러오고 나서, dir 함수를 사용하면 그 모듈 내에있는 여러가지 데이터라던지 함수를 알아낼 수 있습니다. 우선은 눈에 보이는 함수 이름들 중 몇가지만 한번 사용해보도록 합시다. 모듈 내에 있는 함수를 사용하려면 '모듈명.함수명'과 같이 사용합니다. 아래를 한번 보시죠.

>>> math.sin(90)
0.8939966636005579
>>> math.pow(2, 10)
1024.0
>>> math.pi
3.141592653589793
>>> 

위를 보시면 알겠지만, 우리가 함수를 직접 정의하지 않아도 math라는 모듈을 불러와 그 모듈에 있는 함수들을 그대로 사용할 수 있다는 사실을 알 수 있습니다. 모듈이란 녀석이 상당히 편리하지 않습니까? 파이썬에서는 이런 수학과 관련된 모듈만이 존재하는게 아니라, 시간, 파일 등과 관련된 다양한 모듈이 존재합니다. 위와 같이 내장되어 있는 모듈도 있지만, 당연하게도 우리가 직접 모듈을 만들어서 불러와 사용할 수 있습니다. 이제는 직접 여러 개의 모듈을 만들어 보도록 하는 경험을 가져보도록 할 것 입니다.

 

2. 모듈의 정의

 

우리가 직접 모듈을 정의하여 불러내어 봅시다. 파이썬의 모듈은 사실 파일(.py)로 저장되어 있으며 우리가 위에서 사용한 내장 모듈도 파이썬이 설치되어 있는 디렉터리 내의 lib이라는 디렉터리에서 찾으실 수 있습니다. 간단하게 말하면, 파이썬에서 모듈을 정의한다는 것은 파일을 만든다는 의미입니다. 우선은 간단하게 사칙연산을 지원하는 모듈을 만들어 보도록 합시다. 이 모듈의 이름은 arithmetic로 하도록 합시다. 우선은 윈도우에 기본으로 내장되어 있는 메모장이나 워드패드 등과 같은 텍스트 편집기를 이용해서 모듈을 만들어 보도록 합시다. 모듈의 확장자는 아까 방금 말했듯이 .py니 전체적인 파일의 이름은 arithmetic.py가 됩니다.

def plus(a, b):
	return a + b
def minus(a, b):
	return a - b
def div(a, b):
	return a / b
def mul(a, b):
	return a * b

이렇게 만드셨으면, 이 파일을 파이썬이 설치된 디렉터리 내에 있는 라이브러리 디렉터리에 옮겨보도록 합시다. 저 같은 경우는 C:\Python33\Lib가 파이썬 라이브러리 디렉터리 경로입니다. 이제 IDLE를 실행시켜서 만든 모듈을 불러와 보도록 합시다.

>>> import arithmetic
>>> dir(arithmetic)
['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', 'div', 'minus', 'mul', 'plus']
>>> arithmetic.plus(1, 2)
3
>>> arithmetic.mul(300, 400)
120000

위 예제처럼 import라는 키워드를 이용하여 우리가 만든 arithmetic이란 모듈을 불러올 수 있습니다. 기능이 모두 정상적으로 동작하고 있음을 확인하실 수 있습니다. 파이썬에서 모듈을 찾는 순서는 모듈이 이미 로딩되었는지 확인한 뒤에, 로딩되어 있지 않다면 파이썬 경로를 탐색하며 여기에도 존재하지 않으면 PYTHONPATH 환경변수에 등록된 경로에 들어가 탐색을 시작합니다. 만약 위처럼 모듈명을 같이 적지 않고도 바로 참조를 하려면 아래와 같이 import 구문을 사용하시면 됩니다.

>>> from arithmetic import plus
>>> plus(100, 200)
300
>>> plus(30, 400000)
400030

위 예제에서는 'from 모듈명 import 어트리뷰트'와 같은 형식으로 불러오면 해당 어트리뷰트는 모듈명을 적지 않고도 직접 함수를 참조할 수 있습니다. 여기서 어트리뷰트란 함수나 간단히 변수 등의 이름이라고 생각하시면 됩니다. 만약 모듈에 있는 모든 어트리뷰트를 불러오려면 아래와 같은 방식으로 사용하시면 됩니다.

>>> from arithmetic import *
>>> plus(100, 200)
300
>>> minus(40, 20)
20
>>> mul(40, 10002)
400080
>>> div(500, 2)
250.0

위 예제에서 'from 모듈명 import *'와 같은 식으로 쓰이면 arithmetic 모듈에 있는 모든 어트리뷰트를 불러옵니다. 이 경우에도 따로 모듈명을 적지 않고도 직접 참조가 가능하다는 사실을 알 수 있습니다. 유용하죠? 모듈에 대해 대충 알겠다시는 분들은 한번 이 외에도 직접 여러가지 모듈을 만들어서 불러와 모듈을 이용해보세요. 모두 수고하셨습니다.

저작자 표시 비영리 변경 금지
신고
  1. ZiNee at 2013.11.15 23:06 신고 [edit/del]

    항상 감사합니다. 강좌 잘 읽었습니다.

    Reply
  2. 폰트알려주세요 at 2013.11.19 14:01 신고 [edit/del]

    사용하고 계신 비쥬얼 베이직 폰트 이름좀 알려주시면 안될까요?

    완전 귀여운데

    Reply
  3. maya at 2013.12.03 18:17 신고 [edit/del]

    감사합니다.

    Reply
  4. at 2014.06.02 23:06 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2014.06.03 16:50 신고 [edit/del]

      5*(x**3)+7*(x**2)+8/8*x-6의 경우 계산순서는 아래와 같습니다. 여기서 x의 값이 1이라고 가정해두도록 하겠습니다.

      (1) 먼저 소괄호 내에 있는 거듭제곱 연산을 거칩니다. 1의 3제곱은 1, 1의 2제곱은 역시 1입니다. 따라서, 아래와 같은 식이 만들어집니다.
      5 * 1 + 7 * 1 + 8 / 8 * 1 - 6
      (2) 위 식에서 +와 - 연산자보다 *와 /가 연산 순위가 더 높으므로 우선적으로 *와 / 먼저 계산이 됩니다. 그러므로 아래와 같습니다.
      5 + 7 + 1 - 6 = 7

      파이썬에서의 값
      >>> f(1)
      7.0

      두 값은 서로 동일합니다. 함수가 어떤 값을 반환하도록 할 것인지 말해주시면 따로 작성해드리도록 하겠습니다.

  5. kueum at 2014.06.06 21:07 신고 [edit/del]

    혹시 number_space 가 무엇인지 아시나요?

    Reply
    • BlogIcon EXYNOA at 2014.06.07 10:55 신고 [edit/del]

      number_space가 무엇인지 모르겠습니다. 함수라고 가정한다면 이름만 봤을때는 공백의 수를 세는 함수 인것 같습니다. 아마도, 사용자 정의 함수일 가능성이 높습니다.

  6. at 2014.06.07 12:12 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2014.06.10 23:47 신고 [edit/del]

      어느 부분이 어떻게 안되시는 건가요? 어느 값은 올바르게 변환되고, 또 어떤 값은 올바르게 변환되지 않는 문제인가요?

  7. at 2014.07.29 02:28 [edit/del]

    비밀댓글입니다

    Reply
  8. pds at 2014.08.03 17:15 신고 [edit/del]

    def plus(a, b):
        return a + b
    def minus(a, b):
        return a - b
    def div(a, b):
        return a / b
    def mul(a, b):
        return a * b
    입력하고 py 확장자로 저장하고..님이 하라는데로 햇는데...
    왜 모듈이 만들어 지지 않을까요???
    import 적용해봐도 에러가 떠요.ㅠㅠ

    Reply
    • BlogIcon EXYNOA at 2014.08.20 14:34 신고 [edit/del]

      어떻게 된 부분인지 제가 직접 봐야 알 것 같습니다. 혹시 네이트온 가능하시다면 su6net@nate.com로 친구추가 부탁드립니다.

  9. san at 2014.08.06 11:30 신고 [edit/del]

    class abc :
    ....def __init__(self) :
    ......self.kim = []
    ......self.jin = [] (.은 indent입니다)

    san = abc()

    def plus() :
    ....san.kim.append(1)
    ....san.jin.append(2)

    이런식의 함수가 있다고 하면

    전 plus()를 자꾸 자꾸 호출을 합니다

    그러면 san.jin과 san.kim에 append에 의하여 san.kim = [1,1,1]
    san.jin = [2,2,2] (1,2의 갯수는 plus()호출 만큼의 수)

    여기서 문제가 되는게

    저는 plus()를 호출할때마다 list가 초기화 되길 원해요 즉, plus()호출수 만큼 list가 추가되는게 아니라 san.kim = [1] san.jin = [2] 몇번을 호출하던 이런식으로요

    위에는 간략화 하느라 append(1) 이런식으로 했지만 실제 코드는 순서도 중요하고 자료도 중요한 값들 이거든요..

    overwrite 하는 방법 for i in list : san.kim[i] = 변수값등 의방법이 있겠습니다만...

    그러면 코드를 갈아 엎어야되서 ,,

    append를 이용해서 위와같은 문제를 해결할수 있는 방법이 있을까요?

    Reply
    • BlogIcon EXYNOA at 2014.08.20 14:35 신고 [edit/del]

      약간 이해할 수 없는 부분들이 있네요. 혹시 네이트온으로 대화 가능하시면 su6net@nate.com로 친구추가 해주셔서 대화 걸어주세요.

  10. at 2016.02.26 13:29 [edit/del]

    비밀댓글입니다

    Reply
  11. jae at 2016.05.08 00:33 신고 [edit/del]

    덕분에 많이 배워가요 감사합니다!

    Reply
  12. dankim at 2016.07.09 20:27 신고 [edit/del]

    잘봤어요. 감사합니다

    Reply
  13. swyshy at 2017.01.24 14:17 신고 [edit/del]

    근데 메모장으로 저장하면 .txt로 저장되는데 어떻게 .py로 저장하나요..

    Reply

submit

티스토리 툴바