모듈과 표준 라이브러리

Python에는 이미 사용할 수 있는 수많은 도구가 있습니다. 난수 생성, 수학, 날짜, 파일 경로 등이 있습니다. 이러한 도구들은 모듈에 살아있으며, import를 사용하여 코드로 가져옵니다. 파일과 예외 장에서 이미 import json을 사용했습니다. 이 장에서는 import를 완전히 다루고 표준 라이브러리의 가장 유용한 부분을 소개합니다.
모듈 임포트하기
가장 간단한 import는 전체 모듈을 가져오고 점 표기법으로 내용을 사용할 수 있게 합니다. 모듈의 특정 이름을 임포트하여 접두사 없이 직접 사용할 수도 있습니다. 별칭은 긴 이름을 단축합니다.
import math
math.sqrt(16) # 4.0
math.pi # 3.141592653589793
math.floor(3.9) # 3
math.ceil(3.1) # 4모듈의 특정 이름을 임포트하면 접두사 없이 직접 사용할 수 있습니다:
from math import sqrt, pi
sqrt(16) # 4.0 ("math." 접두사가 필요 없음)
pi # 3.141592653589793모듈이나 이름에 별칭을 주어 단축합니다:
import math as m
m.sqrt(16) # 4.0
from math import sqrt as square_root
square_root(25) # 5.0별칭은 인기 있는 타사 라이브러리에서 흔합니다(import numpy as np, import pandas as pd). 표준 라이브러리 모듈의 경우 전체 이름을 사용하는 것을 선호합니다. 코드가 더 읽기 쉬워집니다.
import math는 전체 모듈을 가져오고, 점으로 내부에 접근합니다: math.sqrt(16). from math import sqrt는 하나의 이름을 가져와서 접두사를 제거할 수 있습니다. as 키워드는 긴 import의 이름을 바꾸지만, 표준 라이브러리의 경우 전체 이름이 더 명확하게 읽힙니다. random
random 모듈은 난수를 생성하고 무작위 선택을 합니다. 게임, 시뮬레이션, 무작위 샘플링, 예측 불가능성이 필요한 모든 것에 사용합니다. 시드를 설정하면 결과를 재현할 수 있습니다. 같은 시드는 매번 같은 시퀀스를 생성합니다.
import random
random.random() # 0과 1 사이의 float (배타적)
random.randint(1, 10) # 1부터 10까지의 정수 (둘 다 포함)
random.uniform(1.0, 10.0) # 1.0과 10.0 사이의 float
colours = ["빨강", "녹색", "파랑"]
random.choice(colours) # 하나의 항목을 선택합니다
random.choices(colours, k=3) # k개의 항목을 선택합니다 (복원 추출)
random.sample(colours, k=2) # k개의 항목을 선택합니다 (비복원 추출)
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers) # 제자리에서 섞고 None을 반환합니다재현 가능한 결과를 위해(테스트 및 데이터 과학에 유용), 생성 전에 시드를 설정합니다:
random.seed(42)
random.randint(1, 100) # 시드 42에 대해 항상 같은 값입니다같은 시드는 모든 시스템의 모든 시간에 같은 시퀀스를 생성합니다.
random.choice()는 리스트에서 하나의 항목을 선택하고, random.randint(1, 10)은 범위에서 정수를 제공합니다(끝 포함). 매 실행마다 같은 결과를 원하나요, 테스트를 위해? 먼저 random.seed()를 호출하면 시퀀스가 잠깁니다. math
math 모듈은 숫자 장에서 만난 기본 산술 연산자를 넘어선 더 고급 수학 연산을 추가합니다. 제곱근, 거듭제곱, 로그, 삼각함수, 그리고 pi와 무한대 같은 특수한 값들이 모두 여기에 있습니다.
import math
math.sqrt(25) # 5.0
math.pow(2, 10) # 1024.0 (2 ** 10과 같지만 항상 float을 반환)
math.log(100, 10) # 2.0 (log base 10)
math.log(math.e) # 1.0 (자연 로그)
math.sin(math.pi / 2) # 1.0
math.cos(0) # 1.0
math.ceil(3.2) # 4
math.floor(3.9) # 3
math.trunc(3.9) # 3 (양수의 경우 int()와 같음)
math.inf # 무한대
math.isnan(float("nan")) # True
math.isinf(math.inf) # Truemath는 + - * /를 넘어: 제곱근, 거듭제곱, 로그, 삼각함수, 그리고 math.pi 같은 상수를 포함합니다. 계산이 기본 연산자를 넘어설 순간 도달하면 이것을 사용하고 직접 수식을 쓰는 것을 건너뜁니다. datetime
datetime 모듈은 날짜와 시간을 처리합니다. datetime.now()는 현재 날짜와 시간을 제공합니다. strftime()은 문자열로 형식화합니다. strptime()은 문자열을 datetime으로 파싱합니다. timedelta는 더하거나 뺄 수 있는 기간을 나타냅니다.
from datetime import datetime, date, timedelta
now = datetime.now() # 현재 날짜와 시간
today = date.today() # 현재 날짜만
print(now.year, now.month, now.day)
print(now.hour, now.minute, now.second)
# 형식화
print(now.strftime("%Y-%m-%d")) # "2024-01-15"
print(now.strftime("%d %B %Y, %H:%M")) # "15 January 2024, 09:42"
# 파싱
deadline = datetime.strptime("2024-12-31", "%Y-%m-%d")
# 산술
tomorrow = today + timedelta(days=1)
next_week = today + timedelta(weeks=1)
diff = deadline - now
print(f"{diff.days} days until deadline")일반 strftime 코드:
| 코드 | 의미 | 예제 |
|---|---|---|
%Y | 4자리 연도 | 2024 |
%m | 월(0으로 채워짐) | 01 |
%d | 일(0으로 채워짐) | 15 |
%H | 시간(24시간) | 09 |
%M | 분 | 42 |
%B | 전체 월 이름 | January |
datetime.now()는 현재 날짜와 시간을 제공합니다. strftime()은 `%Y-%m-%d` 같은 코드로 문자열로 변환하고, strptime()은 반대 방향으로 문자열을 다시 파싱합니다. timedelta는 더하거나 뺄 수 있는 기간이므로 `today + timedelta(days=1)`은 내일입니다. os와 pathlib
pathlib는 파일 경로 작업의 현대적 방식입니다. Path 객체는 / 연산자를 사용하여 경로를 구축, 검사, 네비게이션할 수 있게 합니다. os는 환경 변수와 낮은 수준의 OS 작업에 접근할 수 있게 합니다. 새 코드에는 pathlib를 선호합니다.
from pathlib import Path
p = Path("data/reports")
p.exists() # 경로가 존재하면 True
p.is_dir() # 디렉터리면 True
p.is_file() # 파일이면 True
p.mkdir(parents=True, exist_ok=True) # 디렉터리 생성
for f in p.glob("*.csv"): # 디렉터리의 모든 CSV 파일
print(f.name) # 파일명
report = p / "report_jan.csv" # / 연산자가 경로를 조인합니다
report.stem # "report_jan" (확장자 없는 이름)
report.suffix # ".csv"
report.parent # Path("data/reports")
content = report.read_text() # 파일 내용을 직접 읽습니다
report.write_text("new content\n") # 직접 씁니다os 모듈의 경우:
import os
os.getcwd() # 현재 작업 디렉터리
os.listdir(".") # 디렉터리 내용을 나열합니다
os.path.exists("data.txt") # 경로가 존재하면 True
os.path.join("data", "file.txt") # "data/file.txt" (크로스 플랫폼)
os.environ.get("HOME") # 환경 변수를 읽습니다새 코드에는 pathlib를 선호합니다. 환경 변수가 필요하거나 문자열을 기대하는 오래된 API와 작업할 때 os를 사용합니다.
pathlib.Path는 파일 경로를 객체로 취급합니다. 당신이 찔러볼 수 있습니다: .exists(), .read_text(), .write_text(), .glob(). / 연산자가 조각을 조인하므로 `p / "report.csv"`는 실제 경로처럼 읽힙니다. 새 코드에서는 오래된 `os.path`보다 pathlib를 사용하세요. timeit
timeit는 코드가 얼마나 오래 실행되는지 측정합니다. 두 가지 접근 방식을 비교하고 더 빠른 것을 선택하고 싶을 때 유용합니다. 안정적인 측정을 얻기 위해 여러 번 코드를 실행합니다.
import timeit
# 단일 문을 시간 측정합니다
timeit.timeit("sum(range(1000))", number=10000)
# 더 복잡한 블록을 시간 측정합니다
setup = "data = list(range(1000))"
code = "[x * 2 for x in data]"
time = timeit.timeit(code, setup=setup, number=10000)
print(f"{time:.4f} seconds for 10,000 runs")number는 반복 횟수입니다. 더 많은 반복은 더 안정적인 측정을 제공합니다.
timeit.timeit()는 코드를 반복해서 실행하고 실행 횟수로 나누어 안정적인 호출당 숫자를 얻음으로써 코드의 시간을 재습니다. 추측하는 대신 "이 둘 중 어느 것이 더 빠른가"를 해결하는 방법입니다. 한 번의 실행은 신뢰하기에 너무 시끄러우므로 루프하게 합니다. string
string 모듈은 문자, 숫자, 구두점을 위한 미리 만들어진 문자열 상수를 제공합니다. 문자를 확인해야 할 때나 특정 알파벳에서 무작위 문자열을 생성할 때 유용합니다.
import string
string.ascii_lowercase # "abcdefghijklmnopqrstuvwxyz"
string.ascii_uppercase # "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
string.ascii_letters # 둘 다 결합
string.digits # "0123456789"
string.punctuation # 모든 구두점 문자문자를 확인해야 할 때나 무작위 문자열을 생성할 때 유용합니다:
import string, random
chars = string.ascii_letters + string.digits
password = "".join(random.choices(chars, k=12))자신의 모듈 만들기
모든 Python 파일은 모듈입니다. 다른 파일에서 사용하려면 파일명으로 임포트하세요(.py 제외). 전체 모듈을 임포트하고 점 표기법으로 내용을 사용하거나 특정 이름을 직접 임포트할 수 있습니다.
# utils.py
def clamp(value, lo, hi):
return max(lo, min(value, hi))
PI = 3.14159# main.py
import utils
utils.clamp(150, 0, 100) # 100
utils.PI # 3.14159
from utils import clamp
clamp(50, 0, 100) # 50Python은 임포트하는 파일과 같은 디렉터리(및 몇몇 다른 장소)를 찾으면 모듈을 찾습니다. 더 큰 프로젝트의 경우 모듈은 패키지로 조직됩니다. __init__.py 파일이 있는 디렉터리입니다.
__name__ == "__main__"
Python이 파일을 직접 실행할 때, __name__은 "__main__"으로 설정됩니다. 같은 파일을 모듈로 임포트할 때, __name__은 모듈 이름입니다. 이 패턴은 파일을 직접 실행할 때 실행되지만 다른 모듈에 의해 파일이 임포트될 때 건너뜬 코드를 작성할 수 있게 합니다.
# utils.py
def clamp(value, lo, hi):
return max(lo, min(value, hi))
if __name__ == "__main__":
# 이 것만 실행됩니다: python utils.py
# 이것이 아닌: import utils
print(clamp(150, 0, 100)) # 100이것은 모듈이자 독립 스크립트로 유용한 모든 모듈을 위한 표준 패턴입니다.
if __name__ == "__main__":는 한 파일이 임포트 가능 모듈과 실행 가능 스크립트 둘 다 되게 합니다. 보호 아래의 코드는 `python utils.py`할 때 실행되고, 다른 파일이 `import utils`할 때 건너뜁니다. 모듈의 아래에 빠른 데모나 테스트를 집어넣기에 편합니다. 표준 라이브러리 하이라이트
알아야 할 몇몇 모듈이 더 있습니다. 각각 자신이 직접 구현하려면 의미 있는 작업이 필요한 일반적인 문제를 해결합니다.
collections: 특화된 컨테이너 타입:
from collections import Counter, defaultdict, deque
Counter(["a", "b", "a", "c", "a"]) # Counter({'a': 3, 'b': 1, 'c': 1})
defaultdict(list) # 누락된 키를 자동 생성하는 dict
deque([1, 2, 3], maxlen=5) # 양쪽 끝에서 빠른 append/popitertools: 반복 가능을 위한 도구:
import itertools
list(itertools.chain([1, 2], [3, 4])) # [1, 2, 3, 4]
list(itertools.islice(range(100), 5)) # [0, 1, 2, 3, 4]
list(itertools.combinations([1, 2, 3], 2)) # [(1, 2), (1, 3), (2, 3)]
list(itertools.product([0, 1], repeat=2)) # [(0,0), (0,1), (1,0), (1,1)]sys: Python 해석기에 접근:
import sys
sys.argv # 명령행 인수의 리스트
sys.exit(1) # 상태 코드로 종료
sys.version # Python 버전 문자열타사 패키지: 표준 라이브러리를 넘어, pip는 커뮤니티 패키지를 설치합니다:
pip install requests # HTTP 라이브러리
pip install pandas # 데이터 조작
pip install numpy # 숫자 계산타사 패키지는 이 가이드 범위 밖이지만 패턴은 항상 같습니다. pip install, 그 다음 import.
실제로
random, string, datetime을 결합하여 타임스탬프가 있는 고유한 게임 ID를 생성합니다:
import random
import string
from datetime import datetime
def generate_game_id(length: int = 8) -> str:
chars = string.ascii_uppercase + string.digits
return "".join(random.choices(chars, k=length))
def timestamp() -> str:
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
game_id = generate_game_id()
print(f"[{timestamp()}] Starting game {game_id}")
scores = [random.randint(50, 100) for _ in range(5)]
print(f"Round scores: {scores}")
print(f"Best: {max(scores)}")
