본문 바로가기
Study/Python

[기초문법] 모듈(Module)과 패키지(Package)

by 까망우동 2023. 3. 5.
반응형

Index

# 함수 - 클래스 - 모듈 - 패키지 간의 관계

 

Python 의 method, class, module, package 는 아래 그림과 같이 대략적으로는... 함수⊂클래스⊂모듈⊂패키지 라고 느낌적으로 이해하면 편하다. 각 객체에 대해 간단히 정의해보면 아래와 같다.

 

 

  • Module(모듈): 파이썬 코드 파일(.py 확장자)을 의미하며, 함수, 클래스, 변수 등을 담고있다. 다른 파이썬 파일에서 import해서 사용할 수 있다.
  • Package(패키지): 모듈(파일)을 포함하는 디렉토리(폴더). 패키지 내부에 또 다른 하위 패키지 또는 모듈이 포함될 수 있다.
  • Class(클래스): 객체를 만들기 위한 설계도이며, 데이터와 해당 데이터를 처리하는 함수를 하나의 객체로 묶어서 사용할 수 있다. 
  • Method(메소드): 객체가 가지고 있는 함수. 예를 들어, 리스트에서 사용 가능한 sort()나 append() 같은 함수를 말한다. 

 

Python relationship

 

# Module(모듈) 에 대해 .. (+ 주요 Built-in 모듈)

 

  • 내부(built-in)모듈과 외부 모듈로 구분됨. 내부모듈은 설치가 불필요한 (sys, pickle, random,math 등..) 외부모듈은    설치가 필요한 (numpy, pandas, matplotlib, tensorflow 등..)모듈
  • 'import 모듈', 'from모듈~import 클래스/함수' 로 호출한다. 모듈 닉네임은 as 로 지정한다. 
  • import 한 모듈의 함수는, '모듈이름(닉네임).함수명' 으로 사용한다. 

 

import numpy as np, pandas as pd  # 모듈 호출 및 닉네임 생성

a = np.arange(10) # 호출한 모듈의 함수 사용

 

  • if __name__ == '__main__' 는 모듈에서 숙어처럼 사용하는, 파이썬 코드를 모듈로 사용할 때와 스크립트로 직접 실행할 때 동작을 다르게 하기 위해 사용하는 조건문이다. (스크립트로 실행하는 코드는 다른모듈에서 import 시에 실행하고 싶지 않을경우). 

 

[my_code.py 모듈]

def add(x, y):
    return x + y

if __name__ == '__main__':  
    result = add(3, 5)
    print(result)
# result 의 계산 및 출력은, 다른 모듈에서 my_code.py 모듈을 import 할때 실행되지 않는다.

 

아래 몇가지 Python 의 주요 Built-in 모듈에 대해서 공부해보자.

 

1.  datetime 모듈

datetime 모듈은 날짜와 시간을 다루기 위한 모듈이다. 이 모듈은 date, time, datetime, timedelta 등의 클래스를 제공하여, 날짜와 시간을 다루기 위한 다양한 함수와 메서드를 제공한다. 

현재 시간/ 날짜 생성 , 시간의 합,차이 계산 등 활용 예시를 아래 코드를 통해 알아보자 

 

import datetime

# 현재 날짜와 시간 구하기
now = datetime.datetime.now()  #2023-03-06 11:01:23 

# 오늘의 날짜 구하기
today = datetime.date.today() #2023-03-06

# 문자열로 표현된 날짜와 시간 정보를 datetime 객체로 변환하기
date_str = '2022-03-05'
dt = datetime.datetime.strptime(date_str, '%Y-%m-%d')
print(dt, type(dt)) 

# datetime 객체를 문자열로 변환하기
dt_str = dt.strftime('%Y-%m-%d %H:%M:%S')
print(dt_str, type(dt_str))

# 두 날짜 간의 차이 계산하기
d1 = datetime.date(2022, 3, 5)
d2 = datetime.date(2023, 3, 5)
diff = d2 - d1
print(diff)

# 해당 날짜의 요일 정보 구하기
weekday = d1.weekday()  # 요일을 0~6 사이의 숫자로 반환. 0은 월요일

# timedelta를 사용하여 시간 간격 계산하기
delta = datetime.timedelta(days=30, hours=12, minutes=30, seconds=30)
future_date = now + delta
print(now, future_date, sep='\n')

# timedelta 는 시간간격을 일과 초단위로 저장한다. 
print(delta.days)          # 30
print(delta.seconds)       # 45030

 

2. math 모듈

math 모듈은 수학적인 연산을 수행하는 함수들을 제공한다. 이 모듈은 삼각함수, 지수 함수, 로그 함수 등을 포함하며, 숫자 연산에 필요한 상수도 제공한다. 아래는 math 모듈을 이용한 몇가 활용예시이다.

 

import math 
x = 3.7
y = math.ceil(x) # 올림 
z = math.floor(x) # 내림
print(x,y,z,sep='\n')

x = 25
y = math.sqrt(x) # 제곱근
print(y)

x = 2 ; y=3
z = math.pow(x,y) # x의 y제곱
print(z)

 

3. random 모듈

random 모듈은 무작위 수를 생성하는 다양한 함수들을 제공한다. 이 모듈을 사용하면 난수를 생성하거나 무작위로 데이터를 선택할 수 있다. 난수의 생성부터 선택, 셔플 등 다양한 활용예시를 아래 코드를 통해 알아보자. 

 

import random 

x= random.random()  # 0~1 사이의 임의 실수 생성
y= random.randint(1,10)   # 1,10 사이의 임의 정수 생성 
z = random.choice(['a','b','c'])  # 리스트 안에서 임의 아이템 선정
s = random.sample(['a','b','c'],2) # 중복되지 않는 k개의 항목을 무작위 선택합니다.

print(x,y,z,s, sep='\t')

 

4. sys 모듈

sys 모듈은 인터프리터와 운영체제와 관련된 몇 가지 변수와 함수에 접근할 수 있도록 한다. 아래 탐색경로 확인, 메모리 사용량 확인 등 몇가지 주요 활용 예시를 코드를 통해 확인해보자. 

아래 sys.path 에 append 로 탐색경로를 추가해도 영구적으로 환경변수를 추가하는건 아니고, 현재 실행중인 인터프리터 세션에만 적용된다. 

import sys

# sys.argv 는 리스트 형태로 첫번째 인자는 스크립트(파일)이름, 그 뒤는 입력인자를 저장한다.
print("스크립트 이름:", sys.argv[0]) 
print("인자들:", sys.argv[1:])

# 메모리 할당량(사용량) 확인하기 
a = [1,2,3,4,5]
print(sys.getsizeof(a)) #a 리스트의 메모리 사용량

# 모듈검색 탐로 검색,추가
print(sys.path)  # 모듈을 탐색하는 경로 리스트로 반환
sys.path.append('sbspace')  # sbspace 라는 디렉토리 경로 추가

 

# Package(패키지) 에 대해 ..

  • main_package 라는 패키지 디렉토리안에 module1,2 모듈이 있고, main_package 에 속한 sub_package라는 서브 패키지에 module3 라는 모듈이 있다.
  • main.py 모듈에서 module1,2,3 을 가지고 오려면 package 명을 가장 상위패키지부터 제대로 명시해줘야 한다. 
  • 반면, module1.py 모듈에서 module2 를 가지고 올떄는 현재 디렉토리와 동일하기에 import module2 만 해줘도 된다. (굳이 import 뒤에 package 경로를 기입하지 않고..)

 

  • 모든 디렉토리는 __init__.py 파일을 가지고 있어야, 비로소 패키지로 인식된다. 패키지 역할을 못하는 디렉토리는 모듈을 가지고 있는 폴더역할만 할 뿐 다른 모듈에서 불러다 쓸 수 없다는 뜻이다. 
  • 사실, Python 3.3 부터는 __init__.py 없어도 패키지 역할을 한다.. ㅎㅎ 하지만 해당 패키지를 초기화 하기 위한 스크립트를 포함할 수 있으니 __init__ 생성을 습관화 하자. (예를들어 __init__ 에 print('start')를 넣으면 해당 패키지가 import 될때마다 start 를 출력한다) 

 

반응형

댓글