본문 바로가기
python

[python]파이썬 - 모듈(Module), 패키지(Package)

by skysline 2023. 1. 24.
반응형

모듈(Module), 패키지(Package)

  • 모듈: 변수, 함수, 클래스를 모아놓은 .py 확장자 파일
    • .py 파일: 마크다운이나 셀같은 정보는 없고 순수한 파이썬 코드만 존재
    • .ipynb 파일: 데이터분석가(과학자)들이 파이썬 언어와 데이터로 작업하고 실험할수 있도록 도와주는 Interactive 한 개발 환경에서 실행되는 파일
  • 패키지: 모듈의 기능을 폴더별로 정리한 개념
    • 패키지생성: 기능별로 폴더를 정리하는것과 비슷한 개념
 
# 모듈 불러오기
import <모듈명>

# 패키지에서 모듈 불러오기
from <패키지명> import <모듈명>

# 모듈 안에 함수와 클래스 불러오기
from <모듈명> import <함수 or 클래스>

# 별칭 주기
import <모듈명> as <별칭>
 

sys,os 모듈 사용해 보기

 
 
import sys,os
 
 
sys.path
 
['',
 '/content',
 '/env/python',
 '/usr/lib/python37.zip',
 '/usr/lib/python3.7',
 '/usr/lib/python3.7/lib-dynload',
 '/usr/local/lib/python3.7/dist-packages',
 '/usr/lib/python3/dist-packages',
 '/usr/local/lib/python3.7/dist-packages/IPython/extensions',
 '/root/.ipython']
 
 
os.getcwd()
 
sys.version
 
 
 
  • cpu 개수 확인하기
 
os.cpu_count()
 
2
 
  • 폴더 만들기
    • 폴더가 이미 있을 경우 에러가 발생
os.mkdir("data")
 
os.mkdir("/content/data/files")
 
 
  • 폴더 또는 파일명 변경하기
os.rename("data","data2")
 
 
  • 폴더 삭제하기
os.rmdir("data2/files")
 
 
  • 폴더 존재 여부 확인
os.path.isdir("data1") , os.path.isdir("data2")
 
(False, True)
 
  • 파일 존재 여부 확인
 
os.path.isfile("demo.py")
 
True
 
  • 파일 및 폴더 존재 여부 확인
 
os.path.exists("data2") , os.path.exists("demo.py")
 
(True, True)
 
  • 파일 삭제하기
 
os.remove("demo.py")
 
 

random 모듈 사용해보기

 
 
import random
 
 
  • random 함수
    • 0~1 사이에 랜덤한 실수를 반환한다.
 
random.random()
 
0.8370654726828246
 
  • uniform 함수
    • 두개의 숫자 사이의 랜덤한 실수를 반환한다.
random.uniform(1,10)
 
6.119992584470131
 
  • randint 함수
    • 2개의 숫자사이의 랜덤한 정수를 반환한다.
 
random.randint(0,5)
 
5
 
  • randrange 함수
    • start,stop,step 으로 만들어지는 정수 중에 랜덤값을 반환한다.
 
random.randrange(20)
 
6
 
random.randrange(1,3)
 
1
 
random.randrange(0,10,2)
 
8
 
  • choice 함수
    • 시퀀스 자료형에서 랜덤하게 하나의 요소를 선택해서 반환
lst = [1,2,3,4,5,6]
random.choice(lst)
 
6
 
  • sample 함수
    • 시퀀스 자료형에서 랜덤하게 두번째 인수의 개수로 선택해서 반환
lst = [1,2,3,4,5,6]
random.sample(lst,2)
 
[5, 1]
 
  • shuffle 함수
    • 요소의 순서를 랜덤하게 변경한다.
 
 
 
lst = [1,2,3,4,5,6]
random.shuffle(lst) # 원본을 변경한다.
lst
 
[2, 4, 1, 3, 6, 5]
 
 
 
random.shuffle("안녕하세요 반갑습니다.")
 
 
random.seed(42)
lst = [1,2,3,4,5,6]
random.shuffle(lst)
lst
 
[4, 2, 3, 5, 1, 6]
 

collections 모듈

  • 파이썬의 내장 자료 구조
  • 기존 자료구조를 확장하여 제작된 파이썬 내장모듈
 

deque

from collections import deque
dq = deque()
dq
 
deque([])
 
  • append
dq.append(100)
dq
 
deque([100])
 
  • appendleft
    • 인자로 넣은 값을 왼쪽 부터 추가
dq.appendleft(300)
dq
 
deque([300, 100])
 
lst = [100]
lst.insert(0,300)
lst
 
[300, 100]
 
  • 디큐 객체 생성시 반복가능한 객체를 인자로 넣어도 된다.
dq = deque(range(10))
dq
 
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
 
  • rotate
    • dq 객체 안에 요소를 회전 한다.
dq.rotate()
dq
 
deque([9, 0, 1, 2, 3, 4, 5, 6, 7, 8])
 
dq = deque(range(10))
dq.rotate(5)
dq
 
deque([5, 6, 7, 8, 9, 0, 1, 2, 3, 4])
 
dq[-1] # 인덱싱 지원
 
4
 
dq[:] # 슬라이싱은 지원 안한다.
 
 
 

 

  • 속도도 비교해 봅시다.
%%timeit
dq = deque()
for i in range(1000000):
    dq.append(i)
 
10 loops, best of 5: 97.4 ms per loop
%%timeit
lst = []
for i in range(1000000):
    lst.append(i)
 
10 loops, best of 5: 108 ms per loop
 
%%timeit
lst = [ i for i in range(1000000)]
 
10 loops, best of 5: 68.7 ms per loop
 

defaultdict

  • 딕셔너리의 단점으로 없는 key 접근시 에러가 발생하는 단점을 보완
  • 딕셔너리에 없는 key에 접근시 지정한 기본값을 이용하여 key,value 를 생성
d = {}
d["key1"]
 
 
from collections import defaultdict

default_dict = defaultdict(lambda:0)
default_dict["key1"]
 
0
 
 
 
default_dict
 
defaultdict(<function __main__.<lambda>>, {'key1': 0})
 
 
 
dict(default_dict)
 
{'key1': 0}
 
 
 
d = {
    "key1" : 0,
     "key2" :1
}
defaultdict(lambda:0,d)
 
defaultdict(<function __main__.<lambda>>, {'key1': 0, 'key2': 1})
 

defaultdict 활용방법

 
  • 딕셔너리 예시
 
tup_list = [
    ("경제","10시 경제기사"),
    ("정치","10시 정치기사"),
    ("사회","10시 사회기사"),
    ("경제","14시 경제기사"),
    ("정치","15시 정치기사"),
]

news_dict = {}
for k,v in tup_list:
    if news_dict.get(k) is None:
        news_dict[k] = []
    news_dict[k].append(v)
news_dict
 
{'경제': ['10시 경제기사', '14시 경제기사'],
 '사회': ['10시 사회기사'],
 '정치': ['10시 정치기사', '15시 정치기사']}
 
news_dict = defaultdict(list)
for k,v in tup_list:
    news_dict[k].append(v)
news_dict
 
defaultdict(list,
            {'경제': ['10시 경제기사', '14시 경제기사'],
             '사회': ['10시 사회기사'],
             '정치': ['10시 정치기사', '15시 정치기사']})
 

OrderedDict

  • 순서를 가진 딕셔너리 객체
  • key, value 생성한 순서대로 저장된다.
 
 
 
from collections import OrderedDict
order_dict = OrderedDict()
order_dict["사과"] = 200
order_dict["딸기"] = 100
order_dict["포도"] = 500

for k,v in order_dict.items():
    print(k,v)
 
사과 200
딸기 100
포도 500
 

Counter

  • 시퀀스 자료형의 데이터의 값의 개수를 딕셔너리 형태로 반환
from collections import Counter
Counter("aaabbc")
 
Counter({'a': 3, 'b': 2, 'c': 1})
 
counter = Counter({"사과":3,"포도":2,"딸기":1,"참외":4})
counter
 
Counter({'딸기': 1, '사과': 3, '참외': 4, '포도': 2})
 
  • most_common
    • values 를 기준으로 내림차순 정렬하여 key,value 를 튜플에 담고 리스트에 담아 반환
counter.most_common()
 
[('참외', 4), ('사과', 3), ('포도', 2), ('딸기', 1)]
 
  • elements
    • value의 갯수 만큼 key를 반복할수있는 객체를 반환
for i in counter.elements():
    print(i)
 
사과
사과
사과
포도
포도
딸기
참외
참외
참외
참외
 

파이썬 속도 향상을 위한 팁

 
  • 단순하게 반복해서 데이터를 담아야하는 경우
 
 
 
# bad
lst = []
for i in range(1,1000):
    if i % 2 == 0:
        lst.append(i)
 
 
 
# good
lst = [i for i in range(1,1000) if i % 2 == 0 ]
 
 
  • 여러개의 변수를 초기화 할때...
 
# bad
a = None
b = 0
c = ""
 
# good
a,b,c = None,0,""
 
 
  • 컬랙션에 있는 문자열을 연결할때
 
 
 
# bad
lst = [
    ("A반","90점"),
    ("B반","88점"),
    ("C반","95점")
]
for s1,s2 in lst:
    print(f"{s1} {s1}")
 
A반 A반
B반 B반
C반 C반
 
# good
for s in lst:
    print(" ".join(s))
 
A반 90점
B반 88점
C반 95점
 
  • 함수 호출은 컴퓨팅 비용이 많이 든다.
# bad
%%timeit
def square(n):
    return n**2
square_list = []
for i in range(1000000):
    square_list.append(square(i))
 
1 loop, best of 5: 398 ms per loop
 
# good
%%timeit
def square():
    square_list = []
    for i in range(1000000):
        square_list.append(i**2)
    return square_list
square()
 
1 loop, best of 5: 352 ms per loop
 
  • 모듈을 불러올때...
Counter()
 
 
Counter()
반응형

댓글