ABOUT ME

AIFFEL대전에서 인공지능을 시작했다. 새로운 시작이다. 녹녹치는 않다. 하지만 해볼만 하다.

Today
Yesterday
Total
  • [파이썬]09. 모듈과 패키지
    파이썬 2022. 3. 31. 16:01

    [파이썬]09. 모듈과 패키지

    1. 모듈

    (1) 모듈의 장점

    (2) 모듈의 종류

    (3) 사용자 정의 모듈

    (4) 파이썬 표준 모듈

    (5) 네임스페이스

    2. 패키지

    (1) 패키지 구조 예제

    (2) 패키지 실행

    (3) 패키지 구성 파일

    =========================

     

    [파이썬]09. 모듈과 패키지

     

    1. 모듈 Module

    (1) 모듈 개요

    - 함수, 변수 그리고 클래스의 집합

    - 다른 파이썬 프로그램에서 가져와 사용할 수 있는 파이썬 파일

    - 파이썬에는 다른 사람들이 만들어 놓은 모듈이 굉장히 많음

    - 사용자가 모듈을 직접 만들어서 사용할 수도 있음.

    (2) 모듈의 장점

    ⓐ 단순성 simplicity

    - 전체 문제에 초점을 맞추기 보다는 문제의 상대적으로 작은 부분에만 초점을 맞춤

    - 단일 모듈로 작업할 수 있는 작은 도메인

    - 개발이 쉬우며 오류발생이 적음

    ⓑ 유지보수성 maintainability

    - 일반적으로 모듈은 서로 다른 문제 영역 간에 논리적 경계를 설정하도록 설계

    - 상호 의존성을 최소화하는 방식으로 모듈을 작성하여 단일 모듈을 수정하면 프로그램의 다른 부분에 영향을 미칠 가능성이 줄어듬.

    - 모듈 외부의 응용프로그램에 대해 전혀 알지 못해도 모듈을 변경할 수 있음.

    - 개발팀이 대규모 응용프로그램에서 공동으로 작업할 수 있음

    ⓒ 재사용성 reusability

    - 단일 모듈에서 정의된 기능은 응용프로그램의 다른 부분에서 (적절히 정의된 인터페이스를 통해) 쉽게 재사용 가능

    - 중복 코드를 만들 필요가 없음

    ⓓ 범위 지정 scoping

    -  일반적으로 모듈은 프로그램의 여러 영역에서 식별자 간의 충돌을 피하는 데 도움이 되는 별도의 네임스페이스를 정의

     

    (3) 모듈의 종류

    1) 사용자 정의 모듈 : 사용자가 직접 정의해서 사용하는 모듈

    2) 표준 모듈 : 파이썬에서 기본 제공하는 모듈

    3) 서드 파티 모듈 : 외부에서 제공하는 모듈

    - 파이썬 표준 모듈에 모든 기능이 있지 않음.

    - 서드 파티 모듈을 이용해 고급 프로그래밍 가능

    - 게임 개발을 위한 Pygame, 데이타베이스 기능의 SQLAlchemy, 데이터 분석 기능의 NumPy

     

    (4) 사용자 정의 모듈

    1) 사용자가 사용할 모듈을 직접 정의

    2) 모듈 이름으로 파일명을 사용

    3) IPython 내장 매직 명령어(magic command) 사용

    - %%writefile : 셀의 코드를 .py 파이썬 코드 파일로 저장

    - %load : 파이썬 코드 파일 불러오기

    - %run : 파이썬 코드 파일 실행

    %%writefile Module.py
    def func1():
        print("Module.py: func1()")
    
    def func2():
        print("Module.py: func2()")
    
    def func3():
        print("Module.py: func3()")
    %load Module.py
    %run Module.py
    import Module 
    Module.func1()
    Module.func2()
    Module.func3()
    from Module import *
    func1()
    func2()
    func3()

    4) 예제 : 계산기 모듈 만들기

    - 사용자 정의 모듈을 이용해서 계산기에 필요한 기능들로 모듈 만들기

    %%writefile Calculator.py 
    def add(a, b):
        return a + b
    
    def sub(a, b):
        return a - b
    
    def mul(a, b):
        return a * b
    
    def div(a, b):
        return a / b
    
    def mod(a, b):
        return a % b
    from Calculator import *
    print(add(3, 5))
    print(sub(3, 5))
    print(mul(3, 5))
    print(div(3, 5))
    print(mod(3, 5))

    (5) 파이썬 표준 모듈

    - 파이썬에서 기본으로 내장된 유용한 속성과 함수들이 많음

    import sys
    print(sys.builtin_module_names)
    print(dir(__builtins__))

    1) 시간모듈 datetime

    - 운영체제가 제공하는 시간 기능을 파이썬에서 사용할 수 있도록 만들어진 모듈

    - 시간 모듈을 사용하기 위해서는 import time 필요

    import time
    print(dir(time))
    
    print(time)
    print(time.time())
    
    now = time.gmtime(time.time())
    print(now)
    print(type(now))
    
    year = now.tm_year
    month = now.tm_mon
    day = now.tm_mday
    print(str(year)+'년', str(month)+'월', str(day)+'일')
    
    hour = now.tm_hour 
    min = now.tm_min
    sec = now.tm_sec
    print(str(hour)+'시', str(min)+'분', str(sec)+'초')

    - 날짜시간 모듈 datetime의 date 클래스 예제

    from datetime import date 
    print(date)
    date?
    print(date(2022,4,1))
    print(date(year=2022, month=4, day=1))
    print(date.today())
    
    today = date.today()
    print(today)
    year = str(today.year)
    month = str(today.month)
    day = str(today.day)
    weekday = "월화수목금토일"[today.weekday()]
    print(year+'년', month+'월', day+'일', weekday+'요일')

    - 날짜시간 모듈 datetime의 time 클래스 예제

    from datetime import time 
    print(time)
    time?
    print(time(12, 20))
    print(time(12, 20, 32))
    print(time(12, 20, 32, 100000))
    
    now = time(12, 20, 32, 100000)
    hour = str(now.hour)
    min = str(now.minute)
    sec = str(now.second)
    msec = str(now.microsecond)
    print(hour+"시", min+"분", sec+"초", msec+"마이크로초", )

    - 날짜시간 모듈 datetime의 datetime 클래스 예제

    - 날짜시간을 문자열로 표현하기 위한 strftime()메소드 예제

    표현 설명
    %Y 년(YYYY)
    %y 년(yy)
    %m 월(mm)
    %d 일(dd)
    %A 요일
    %H 시간(24)
    %I 시간(12)
    %p AM, PM
    %M 분(MM)
    %S 초(SS)
    %f 마이크로초
    from datetime import datetime 
    print(datetime)
    #datetime?
    print(datetime(2022, 4, 1))
    print(datetime(2022, 4, 1, 11, 15, 1))
    print(datetime.now())
    
    now = datetime.now()
    print(now.strftime("%Y년 %m월 %d일 %H시 %M분 %S초"))
    print(now.strftime("%y/%m/%d %p %I:%M:%S.%f"))

    - 예제 : 태어난지 몇 일이 되었는가? (태어난지 얼마나 지났는지 계산하기

    from datetime import date 
    birthday = date(1967, 7, 11)
    today = date.today()
    days = today - birthday
    print(days)

     

    2) 수학모듈 math

    import math 
    print(dir(math))

    - math 모듈 대표 상수

    상수 설명
    math.pi 원주율
    math.e 자연상수
    math.inf 무한대

    - math 모듈에서 제공하는 대표 함수

    함수 설명
    math.factorial(x) x 의 팩토리얼
    math.gcd(a,b) a 와 b의 최대공약수
    math.floor(x) x 의 내림값
    math.ceil(x) x 의 올림값
    math.pow(x, y) x 의 y승
    math.sqrt(x) x 의 제곱근
    math.log(x, base) base를 밑으로 하는 x로그
    math.sin(x) x 라디안의 사인
    math.cos(x) x 라디안의 코사인
    math.tan(x) x 라디안의 탄젠트
    math.degrees(x) x 라디안을 도 단위로 변환
    math.radians(x) x 도를 라디안 단위로 변환
    import math 
    print(math.factorial(3))
    print(math.gcd(12,24))
    print(math.floor(math.pi))
    print(math.ceil(math.pi))
    print(math.pow(2, 4))
    print(math.sqrt(10))
    print(math.log(10, 2))
    print(math.degrees(math.pi))
    print(math.radians(180))
    print(math.sin(math.radians(90)))
    print(math.cos(math.radians(180)))

     

    3) 순열과 조합 모듈 itertools

    - itertools 모듈에서 곱집합, 순열, 조합 등을 구하는 함수 제공

    함수 설명
    itertools.product(seq1,...) 시퀀스의 곱집합
    itertools.permutation(p, r) p시퀀스의 요소 r개를 나열하는 순열
    itertools.combination(p, r) p시퀀스의 요소 r개를 선택하는 조합
    itertools.combination_with_replacement(p, r) p시퀀스의 요소 r개를 중복 허용해 선택하는 조합
    import itertools 
    list_1 = ['a', 'b', 'c']
    print(list_1)
    list_2 = [1, 2]
    print(list_2)
    list_cp = list(itertools.product(list_1, list_2))
    print(list_cp)
    list_p = list(itertools.permutations(list_1, 2))
    print(list_p)
    list_c = list(itertools.combinations(list_1, 2))
    print(list_c)
    list_cr = list(itertools.combinations_with_replacement(list_1, 2))
    print(list_cr)

    4) 통계 모듈 statistics

    - statistics 모듈에서는 산술평균, 표준편차 등 통계에 필요한 계산 관련 함수들을 제공

    함수 설명
    statistics.median(seq) 시퀀스의 중앙값
    statistics.mean(seq) 시퀀스의 산술평균
    statistics.harmonic_mean(seq) 시퀀스의 조화평균
    statistics.stdev(seq) 시퀀스의 표본 표준편차
    statistics.variance(seq) 시퀀스의 표본 분산
    import statistics 
    values = [56, 44, 67, 47, 82, 67, 92, 89, 81, 82]
    print(statistics.median(values))
    print(statistics.mean(values))
    print(statistics.harmonic_mean(values))
    print(statistics.stdev(values))
    print(statistics.variance(values))

    5) 랜덤 모듈 random

    함수 설명
    random.random() 0.0~1.0 사이의 실수 값 반환
    random.randint(1, 10) 1~10 사이의 정수 반환
    random.randrange(0, 10, 2) 0~10 사이의 2의 배수만 반환
    random.choice() 자료형 변수에서 임의의 값 반환
    random.sample() 자료형 변수에서 필요한 개수만큼 반환
    random.shuffle() 자료형 변수 내용을 랜덤으로 셔플
    import random 
    print(random.random())
    print(random.randint(1,10))
    print(random.randrange(1, 10, 2))
    li = [10, 20, 30, 40, 50]
    print(li)
    print(random.choice(li))
    print(random.sample(li, 3))
    random.shuffle(li)
    print(li)

    (6) 네임스페이스 

    - 모듈 호출의 범위 지정

     

    1) 모듈 이름에 alias를 설정하여 모듈의 이름을 바꿔 사용

    import random as rd
    print(rd.random())
    print(rd.randint(1,10))

    2) from 구문을 사용하여 모듈에서 특정 함수 또는 클래스만 호출

    from random import random, randrange
    print(random())
    print(randrange(1, 10, 2))

    3) *를 사용하여 모듈 안의 모든 함수/클래스/변수를 가져옴

    from random import *
    print(random())
    print(randrange(1, 10, 2))

     

    2. 패키지

    (1) 패키지 개요

    - 패키지는 모듈의 집합

    - 패키지 안에 여러 모듈이 존재

    - 모듈을 주제별로 분리할 때 사용

    - 디렉토리와 같이 계층적인 구조로 관리

    - 모듈이 서로 포함관계를 가지며, 거대한 패키지를 가짐

    - 파이썬에서는 패키지가 하나의 라이브러리

    (2) 패키지 구조 예제

    !mkdir package
    !mkdir package/sub_package_1
    !mkdir package/sub_package_2
    !mkdir package/sub_package_3
    %%writefile package/sub_package_1/sub1_module_1.py 
    def print_module():
        print("sub_package_1/sub1_module_1")
        
    %%writefile package/sub_package_1/sub1_module_2.py 
    def print_module():
        print("sub_package_1/sub1_module_2")
    
    %%writefile package/sub_package_2/sub2_module_1.py 
    def print_module():
        print("sub_package_2/sub2_module_1")
    
    %%writefile package/sub_package_2/sub2_module_2.py 
    def print_module():
        print("sub_package_2/sub2_module_2")
    
    %%writefile package/sub_package_3/sub3_module_1.py 
    def print_module():
        print("sub_package_3/sub3_module_1")
    
    %%writefile package/sub_package_3/sub3_module_2.py 
    def print_module():
        print("sub_package_3/sub3_module_2")

    (3) 패키지 실행

    from package.sub_package_1 import sub1_module_1, sub1_module_2
    sub1_module_1.print_module()
    sub1_module_2.print_module()
    from package.sub_package_2 import sub2_module_1, sub2_module_2
    sub2_module_1.print_module()
    sub2_module_2.print_module()
    from package.sub_package_3 import sub3_module_1, sub3_module_2
    sub3_module_1.print_module()
    sub3_module_2.print_module()
    from package import *
    sub1_module_1.print_module()
    sub1_module_2.print_module()
    sub2_module_1.print_module()
    sub2_module_2.print_module()
    sub3_module_1.print_module()
    sub3_module_2.print_module()

    (4) 패키지 구성 파일

    1) __init__.py

    - 파이썬 패키지를 선언하는 초기화 스크립트

    - 패키지에 대한 메타데이터에 해당하는 내용 포함

    - 파이썬 버전 3.3부터는 __init__.py 파일이 없어도 패키지로 인식

    - 파이썬 버전 3.3 밑의 하위 버전과 호환을 위해 __init__.py 파일 생성

    - __all__ 이라는 리스트형의 변수에 하위 패키지의 이름을 작성

    %%writefile package/__init__.py 
    __all__ = ['sub_package_1','sub_package_2','sub_package_3']
    %%writefile package/sub_package_1/__init__.py 
    __all__ = ['sub1_module_1', 'sub1_module_2']
    %%writefile package/sub_package_2/__init__.py 
    __all__ = ['sub2_module_1', 'sub2_module_2']
    %%writefile package/sub_package_3/__init__.py 
    __all__ = ['sub3_module_1', 'sub3_module_2']

    2) __main__.py

    - 패키지 자체를 실행하기 위한 용도

    - 패키지를 실행시키면 __main__.py 실행

    %%writefile package/__main__.py 
    from sub_package_1 import *
    from sub_package_2 import *
    from sub_package_3 import *
    
    if __name__ == '__main__':
        sub1_module_1.print_module()
        sub1_module_2.print_module()
        sub2_module_1.print_module()
        sub2_module_2.print_module()
        sub3_module_1.print_module()
        sub3_module_2.print_module()
    !python package

    '파이썬' 카테고리의 다른 글

    [Numpy] 넘파이 한번에 끝내기  (0) 2022.04.06
    [파이썬]08. 객체와 클래스  (0) 2022.03.30
    [파이썬]07. 함수  (0) 2022.03.29
    [파이썬]06. 입력과 출력  (0) 2022.03.28
    [파이썬]03. 문자열  (0) 2022.03.27
Designed by Tistory.