본문 바로가기
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 를 출력한다) 

     

    반응형

    댓글