본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
Ch. 11. 함수에도 내장함수와 외장함수가 있네요(2)
파이썬은 강력하고 다재다능한 언어입니다. 그 핵심에는 내장 함수(built-in functions)와 함께, 우리가 필요한 기능을 손쉽게 가져다 쓸 수 있도록 도와주는 수많은 외장 함수(External Functions), 즉 모듈(Modules)들이 존재합니다. 이 모듈들은 특정 기능을 묶어놓은 파일 형태로 제공되어, 필요한 순간 import 문 하나로 가져와 사용할 수 있습니다.
이번 블로그 글에서는 파이썬 외장 함수(모듈)의 기본 사용법을 알아보고, 여러분의 코딩 생활을 더욱 풍요롭게 만들어 줄 핵심 모듈 몇 가지를 자세히 파헤쳐 보겠습니다. 각 모듈의 기능, 사용 예시 코드, 그리고 장단점까지 함께 살펴보겠습니다.
외장 함수(모듈) 사용의 기본: import 문
파이썬에서 외장 함수를 사용하려면 해당 함수가 속해있는 모듈을 먼저 가져와야 합니다. 이때 사용하는 키워드가 바로 import입니다.
기본 사용법:
import module_name
이렇게 가져온 모듈의 함수를 호출할 때는 모듈명.함수명() 형태로 사용합니다.
특정 함수만 가져오기:
from module_name import function_name
이 경우 함수명()만으로 직접 호출할 수 있습니다.
별칭(Alias) 지정:
import module_name as mn
이 경우 mn.함수명() 형태로 사용합니다. 긴 모듈 이름을 줄여쓰거나 이름 충돌을 피할 때 유용합니다.
주요 외장 함수(모듈) 심층 분석
이제 다양한 분야에서 활용되는 핵심 모듈들을 하나씩 살펴보겠습니다.
1. sys 모듈: 파이썬 인터프리터 제어의 시작점
sys 모듈은 파이썬 인터프리터와 상호작용하는 기능을 제공합니다. 시스템 관련 정보에 접근하거나, 인터프리터의 동작 방식을 제어할 수 있게 해줍니다.
sys 모듈은 파이썬 프로그램이 실행되는 환경에 대한 정보(예: 파이썬 버전, 플랫폼 정보, 모듈 검색 경로)를 제공하고, 표준 입출력 스트림(stdin, stdout, stderr)을 제어하며, 프로그램 종료 등 시스템 수준의 작업을 수행할 수 있도록 합니다.
sys.argv: 명령줄 인수(Command-line arguments)를 리스트 형태로 반환합니다.
# test_sys.py
import sys
if __name__ == "__main__":
print(f"스크립트 이름: {sys.argv[0]}")
if len(sys.argv) > 1:
print(f"전달된 인수: {sys.argv[1:]}")
else:
print("인수가 전달되지 않았습니다.")
# 실행 예시: python test_sys.py hello world
# 출력:
# 스크립트 이름: test_sys.py
# 전달된 인수: ['hello', 'world']
sys.exit(status): 프로그램을 종료합니다. status는 종료 코드(0은 정상 종료, 0이 아닌 값은 오류 종료)를 나타냅니다
import sys
def validate_input(value):
if not isinstance(value, int):
print("오류: 입력 값은 정수여야 합니다.", file=sys.stderr)
sys.exit(1) # 오류 종료
validate_input("abc")
print("이 메시지는 출력되지 않습니다.")
sys.path: 모듈을 찾을 때 검색하는 디렉토리 경로들을 리스트 형태로 반환합니다.
import sys
print(f"모듈 검색 경로: {sys.path}")
sys.version: 현재 사용 중인 파이썬 버전 정보를 문자열로 반환합니다.
import sys
print(f"파이썬 버전: {sys.version}")
- 장점:
- 파이썬 프로그램과 실행 환경 간의 상호작용을 가능하게 합니다.
- 명령줄 인수를 쉽게 처리하여 유연한 스크립트를 작성할 수 있습니다.
- 프로그램의 비정상적인 종료를 제어하여 오류 처리를 개선할 수 있습니다.
- 단점:
- 운영체제에 따라 특정 기능의 동작 방식이 다를 수 있어 이식성에 주의해야 합니다.
- 시스템 수준의 작업이므로 잘못 사용하면 프로그램이나 시스템에 영향을 줄 수 있습니다.
2. os 모듈: 운영체제와 소통하기
os 모듈은 운영체제(Operating System)와 상호작용하는 다양한 기능을 제공합니다. 파일 시스템, 환경 변수, 프로세스 관리 등 운영체제 관련 작업을 수행할 수 있습니다.
os 모듈은 운영체제 독립적인 방식으로 파일 및 디렉토리 조작, 환경 변수 접근, 프로세스 실행 등 운영체제와 관련된 다양한 작업을 수행할 수 있도록 돕습니다. 윈도우, macOS, Linux 등 어떤 운영체제에서 실행되든 동일한 코드로 작업할 수 있는 이식성을 제공합니다.
os.getcwd(): 현재 작업 디렉토리(Current Working Directory)를 반환합니다.
import os
print(f"현재 작업 디렉토리: {os.getcwd()}")
os.chdir(path): 작업 디렉토리를 변경합니다.
import os
# os.chdir('/Users/your_user/Documents') # 예시: 문서 폴더로 이동
# print(f"변경된 작업 디렉토리: {os.getcwd()}")
os.listdir(path='.'): 특정 경로의 파일 및 디렉토리 목록을 리스트로 반환합니다.
import os
print(f"현재 디렉토리의 파일/폴더 목록: {os.listdir()}")
os.mkdir(path): 디렉토리를 생성합니다.
import os
if not os.path.exists("new_folder"):
os.mkdir("new_folder")
print("new_folder 생성 완료.")
else:
print("new_folder가 이미 존재합니다.")
os.remove(path): 파일을 삭제합니다. os.rmdir(path)는 빈 디렉토리를 삭제합니다.
# import os
# with open("test_file.txt", "w") as f:
# f.write("temporary file")
# os.remove("test_file.txt")
# print("test_file.txt 삭제 완료.")
os.path.join(path, *paths): 여러 경로 구성 요소를 운영체제에 맞는 방식으로 결합합니다. (경로 구분자를 알아서 처리)
import os
file_path = os.path.join("data", "raw", "input.csv")
print(f"결합된 파일 경로: {file_path}") # Windows: data\raw\input.csv, Linux/macOS: data/raw/input.csv
os.environ: 환경 변수를 딕셔너리 형태로 반환합니다.
import os
# print(f"HOME 환경 변수: {os.environ.get('HOME')}") # Linux/macOS
# print(f"PATH 환경 변수: {os.environ.get('Path')}") # Windows
- 장점:
- 운영체제 독립적인 파일 및 디렉토리 조작이 가능하여 코드의 이식성을 높입니다.
- 다양한 시스템 관련 작업(환경 변수 접근, 프로세스 실행 등)을 수행할 수 있습니다.
- 자동화 스크립트 작성에 필수적인 모듈입니다.
- 단점:
- 파일 경로 조작 등 일부 기능은 pathlib 모듈이 더 객체 지향적이고 편리할 수 있습니다.
- 프로세스 실행 등 강력한 기능은 보안에 주의해서 사용해야 합니다.
3. pickle 모듈: 파이썬 객체 직렬화
pickle 모듈은 파이썬 객체를 직렬화(serialization)하여 파일에 저장하거나 네트워크를 통해 전송할 수 있는 형태로 변환하고, 다시 역직렬화(deserialization)하여 파이썬 객체로 복원하는 기능을 제공합니다.
pickle은 파이썬 객체의 계층 구조(리스트, 딕셔너리, 클래스 인스턴스 등)를 그대로 보존하면서 바이트 스트림(byte stream)으로 변환하는 프로세스를 '피클링(pickling)' 또는 '직렬화'라고 합니다. 이 바이트 스트림을 파일에 저장하거나, 다른 파이썬 프로그램으로 전송할 수 있습니다. 반대로 바이트 스트림을 원래의 파이썬 객체로 되돌리는 것을 '언피클링(unpickling)' 또는 '역직렬화'라고 합니다.
pickle.dump(obj, file): 파이썬 객체 obj를 파일 file에 직렬화하여 저장합니다.
pickle.load(file): 파일 file에서 직렬화된 데이터를 읽어 파이썬 객체로 역직렬화합니다.
import pickle
data = {
'name': '김철수',
'age': 30,
'cities': ['서울', '부산', '대구']
}
# 1. 객체를 파일에 저장 (피클링)
with open('data.pickle', 'wb') as f: # 'wb'는 write binary 모드
pickle.dump(data, f)
print("객체가 data.pickle 파일에 저장되었습니다.")
# 2. 파일에서 객체 로드 (언피클링)
with open('data.pickle', 'rb') as f: # 'rb'는 read binary 모드
loaded_data = pickle.load(f)
print("파일에서 로드된 객체:", loaded_data)
print(f"이름: {loaded_data['name']}, 나이: {loaded_data['age']}")
# 클래스 인스턴스 피클링/언피클링 예시
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name={self.name}, age={self.age})"
p = Person("영희", 25)
with open('person.pickle', 'wb') as f:
pickle.dump(p, f)
print("\nPerson 객체가 person.pickle 파일에 저장되었습니다.")
with open('person.pickle', 'rb') as f:
loaded_person = pickle.load(f)
print("파일에서 로드된 Person 객체:", loaded_person)
- 장점:
- 파이썬 객체(리스트, 딕셔너리, 클래스 인스턴스 등)의 복잡한 구조를 그대로 보존하여 저장하고 로드할 수 있습니다.
- 텍스트 기반의 직렬화(JSON, XML)보다 빠르고 효율적인 경우가 많습니다.
- 파이썬 객체 간의 데이터 교환에 유용합니다.
- 단점:
- 보안 취약점: pickle 파일은 악의적인 코드를 포함할 수 있습니다. 신뢰할 수 없는 소스에서 생성된 pickle 파일을 load() 하는 것은 매우 위험하며, 원격 코드 실행(RCE) 취약점으로 이어질 수 있습니다. 알 수 없는 pickle 파일은 절대 로드하지 마세요!
- 파이썬 종속성: pickle은 파이썬 전용 형식입니다. 다른 프로그래밍 언어에서 pickle로 직렬화된 데이터를 직접 읽거나 쓸 수 없습니다. (데이터 교환에는 JSON, CSV, Protobuf 등이 더 적합)
- 파이썬 버전 호환성 문제가 발생할 수 있습니다.
4. math 모듈: 정교한 수학 계산
math 모듈은 수학 연산을 위한 다양한 함수와 상수를 제공합니다. 복소수를 제외한 실수 기반의 수학 연산에 특화되어 있습니다.
math 모듈은 삼각 함수(sin, cos, tan), 로그 함수(log), 지수 함수(exp), 제곱근(sqrt) 등 복잡한 수학 계산에 필요한 함수들을 제공합니다. 파이썬의 기본 산술 연산자(+, -, *, /, %, **)로는 부족한 과학, 공학 계산에 필수적입니다.
- math.sqrt(x): x의 제곱근을 반환합니다.
- math.floor(x): x보다 작거나 같은 가장 큰 정수를 반환합니다 (내림).
- math.ceil(x): x보다 크거나 같은 가장 작은 정수를 반환합니다 (올림).
- math.fabs(x): x의 절대값을 반환합니다.
- math.pow(x, y): x의 y 제곱을 반환합니다. (float 결과)
- math.sin(x), math.cos(x), math.tan(x): 각도의 삼각 함수 값을 반환합니다. (인수는 라디안)
- math.log(x, base): x의 밑이 base인 로그 값을 반환합니다. (base 생략 시 자연로그 ln)
- math.pi: 원주율 상수
- math.e: 자연 상수 상수
import math print(f"5의 제곱근: {math.sqrt(5)}") print(f"3.14의 내림: {math.floor(3.14)}") print(f"3.14의 올림: {math.ceil(3.14)}") print(f"-10의 절대값: {math.fabs(-10)}") print(f"2의 3제곱: {math.pow(2, 3)}") # 8.0 print(f"원주율 파이: {math.pi}") print(f"자연 상수 e: {math.e}") angle_degrees = 90 angle_radians = math.radians(angle_degrees) # 각도를 라디안으로 변환 print(f"{angle_degrees}도의 사인 값: {math.sin(angle_radians)}") # 1.0 print(f"10의 자연 로그: {math.log(10)}") print(f"8의 2를 밑으로 하는 로그: {math.log(8, 2)}") # 3.0
- 장점:
- 정밀하고 다양한 수학 함수를 제공하여 복잡한 계산을 쉽게 수행할 수 있습니다.
- 과학, 공학, 통계, 데이터 분석 등 다양한 분야에서 활용됩니다.
- C 언어 기반으로 구현되어 있어 파이썬 기본 함수보다 빠르고 효율적입니다.
- 단점:
- 복소수(complex number) 연산은 지원하지 않습니다. (복소수는 cmath 모듈 사용)
- 일부 함수는 인수가 라디안 단위여야 하므로 각도 변환에 주의해야 합니다.
5. random 모듈: 무작위성
random 모듈은 의사 난수(pseudo-random numbers)를 생성하는 다양한 함수를 제공합니다. 시뮬레이션, 게임, 데이터 샘플링 등 무작위성이 필요한 곳에 사용됩니다.
random 모듈은 예측 불가능해 보이는 수열을 생성하지만, 실제로는 특정 알고리즘에 의해 생성되는 '의사(Pseudo)' 난수입니다. 이는 재현 가능한 실험이나 테스트에 유용하게 사용될 수 있습니다.
- random.random(): 0.0 이상 1.0 미만의 부동 소수점 난수를 반환합니다.
import random print(f"0.0에서 1.0 사이의 난수: {random.random()}")
- random.randint(a, b): a 이상 b 이하의 정수 난수를 반환합니다.
import random print(f"1에서 100 사이의 정수 난수: {random.randint(1, 100)}")
- random.randrange(start, stop, step): range(start, stop, step)에서 임의의 요소를 선택합니다. (stop 미만)
import random print(f"0부터 99까지의 임의의 정수: {random.randrange(100)}") # 0 ~ 99 print(f"10부터 20까지의 임의의 정수 (2 스텝): {random.randrange(10, 21, 2)}") # 10, 12, ..., 20 중 하나
- random.choice(seq): 비어있지 않은 시퀀스(리스트, 튜플, 문자열 등)에서 임의의 요소를 하나 선택합니다.
import random fruits = ["사과", "바나나", "체리", "오렌지"] print(f"오늘의 과일: {random.choice(fruits)}")
- random.sample(population, k): 모집단 population에서 중복 없이 k개의 고유한 요소를 선택합니다.
import random numbers = list(range(1, 46)) # 1부터 45까지 lotto_numbers = random.sample(numbers, 6) print(f"이번 주 로또 번호: {sorted(lotto_numbers)}")
- random.shuffle(x): 리스트 x의 요소를 무작위로 섞습니다 (in-place).
import random cards = ["A", "K", "Q", "J", "10"] random.shuffle(cards) print(f"섞인 카드: {cards}")
- 장점:
- 시뮬레이션, 게임 개발, 비밀번호 생성, 데이터 샘플링 등 다양한 분야에서 무작위성이 필요한 경우 유용합니다.
- 의사 난수이므로 시드(seed)를 설정하여 난수열을 재현할 수 있어 테스트 및 디버깅에 편리합니다.
- 단점:
- 진정한 의미의 무작위성이 필요한 암호학적 목적에는 적합하지 않습니다. (암호학적 난수는 secrets 모듈 사용)
- 대규모 시뮬레이션에서는 성능을 고려해야 할 수 있습니다.
6. webbrowser 모듈: 웹 브라우저 제어
webbrowser 모듈은 사용자 시스템의 기본 웹 브라우저를 제어하는 기능을 제공합니다. 웹 페이지를 자동으로 열거나 새 탭/창으로 띄울 때 사용합니다.
- 파이썬 스크립트에서 특정 URL을 기본 웹 브라우저로 열어야 할 때 유용합니다. 예를 들어, 프로그램이 실행된 후 결과 페이지를 자동으로 보여주거나, 도움말 문서를 웹에서 바로 열어주는 등의 기능을 구현할 수 있습니다.
- webbrowser.open(url, new=0, autoraise=True): 지정된 URL을 웹 브라우저로 엽니다.
- new=0: 가능한 경우 동일한 브라우저 창에서 엽니다.
- new=1: 새 브라우저 창을 엽니다.
- new=2: 새 브라우저 탭을 엽니다.
- autoraise: 브라우저 창을 전면으로 가져올지 여부 (기본값 True)
import webbrowser import time print("구글을 열어보겠습니다...") webbrowser.open("https://www.google.com") time.sleep(2) # 잠시 대기 print("네이버를 새 탭으로 열어보겠습니다...") webbrowser.open("https://www.naver.com", new=2)
- webbrowser.open(url, new=0, autoraise=True): 지정된 URL을 웹 브라우저로 엽니다.
- 장점:
- 파이썬 스크립트에서 외부 웹 리소스에 쉽게 접근할 수 있습니다.
- 사용자 편의성을 높이는 기능을 구현할 수 있습니다 (예: 결과 페이지 자동 열기, 도움말 문서).
- 운영체제와 독립적으로 동작합니다.
- 단점:
- 매우 기본적인 기능만을 제공합니다. 웹 페이지의 내용을 파싱하거나, 복잡한 웹 상호작용(로그인, 클릭 등)을 수행하려면 requests, BeautifulSoup, Selenium과 같은 다른 라이브러리가 필요합니다.
- 사용자 시스템의 기본 브라우저 설정에 의존합니다.
7. time 모듈: 시간의 흐름을 다루다
time 모듈은 시간 관련 함수를 제공합니다. 주로 시간 지연, 현재 시간 측정, 시간 형식 변환 등에 사용됩니다.
- time 모듈은 유닉스 에포크(Unix epoch, 1970년 1월 1일 00:00:00 UTC) 이후 경과된 초를 기준으로 시간을 다루거나, 프로그램 실행을 잠시 멈추는 등의 기능을 제공합니다. 날짜와 관련된 복잡한 작업보다는 시간 간격 측정이나 단순한 시간 관련 작업에 더 적합합니다.
- time.time(): 유닉스 에포크 이후 현재까지의 시간을 초 단위로 반환합니다 (부동 소수점).
import time start_time = time.time() # 어떤 작업을 수행 time.sleep(2) # 2초 대기 end_time = time.time() print(f"작업 수행 시간: {end_time - start_time:.2f}초")
- time.sleep(seconds): 지정된 초(float)만큼 프로그램 실행을 일시 중지합니다.
import time print("Hello") time.sleep(1.5) # 1.5초 대기 print("World!")
- time.ctime([secs]): 초 단위의 시간을 읽기 쉬운 문자열 형태로 반환합니다. secs가 없으면 현재 시간을 사용합니다.
import time print(f"현재 시간: {time.ctime()}") print(f"1970년 1월 1일 이후 1000000초: {time.ctime(1000000)}")
- time.strftime(format, t): struct_time 객체 또는 튜플을 지정된 format 문자열에 따라 형식화합니다.
import time current_time_struct = time.localtime() # 현재 시간을 struct_time 객체로 formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time_struct) print(f"현재 시간 (형식화): {formatted_time}")
- 장점:
- 간단한 시간 측정 및 지연 기능을 쉽게 구현할 수 있습니다.
- 프로그램의 동작 흐름을 제어하는 데 유용합니다.
- 단점:
- 날짜 및 시간대(timezone) 처리, 복잡한 날짜 연산 등에는 datetime 모듈이 더 강력하고 적합합니다.
- time.sleep()은 실제 CPU를 점유하지 않고 기다리지만, 정교한 실시간 제어에는 한계가 있습니다.
8. datetime 모듈: 날짜와 시간의 정밀한 관리자
datetime 모듈은 날짜와 시간을 다루는 강력하고 유연한 클래스를 제공합니다. 날짜 계산, 시간대 처리, 날짜/시간 형식 변환 등 복잡한 작업에 필수적입니다.
- datetime 모듈은 date, time, datetime, timedelta, tzinfo 등 다양한 클래스를 제공하여 날짜와 시간을 객체 지향적으로 다룰 수 있게 합니다. 특정 날짜와 시간 간의 차이를 계산하거나, 특정 시간대(timezone)에 맞춰 시간을 표시하는 등 정교한 작업에 적합합니다.
- datetime.date: 날짜(년, 월, 일)를 다루는 클래스
- datetime.time: 시간(시, 분, 초, 마이크로초)을 다루는 클래스
- datetime.datetime: 날짜와 시간을 모두 다루는 클래스
- datetime.timedelta: 두 날짜/시간 간의 차이를 나타내는 클래스 (시간 간격)
import datetime # 현재 날짜 및 시간 now = datetime.datetime.now() print(f"현재 날짜 및 시간: {now}") print(f"현재 연도: {now.year}, 월: {now.month}, 일: {now.day}") print(f"현재 시: {now.hour}, 분: {now.minute}, 초: {now.second}") # 특정 날짜 및 시간 생성 specific_date = datetime.date(2023, 12, 25) print(f"크리스마스: {specific_date}") specific_datetime = datetime.datetime(2024, 7, 10, 14, 30, 0) print(f"특정 날짜 및 시간: {specific_datetime}") # 날짜/시간 계산 (timedelta 사용) tomorrow = now + datetime.timedelta(days=1) print(f"내일 이 시간: {tomorrow}") five_hours_ago = now - datetime.timedelta(hours=5) print(f"5시간 전: {five_hours_ago}") # 두 날짜/시간 간의 차이 계산 delta = now - specific_datetime print(f"현재와 특정 시간의 차이: {delta}") print(f"차이 (일): {delta.days}") print(f"차이 (초): {delta.total_seconds()}") # 날짜/시간 형식 변환 (strftime, strptime) formatted_date_time = now.strftime("%Y년 %m월 %d일 %H시 %M분 %S초") print(f"형식화된 현재 시간: {formatted_date_time}") date_string = "2023-01-15 10:30:00" parsed_datetime = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S") print(f"문자열에서 파싱된 시간: {parsed_datetime}")
- 장점:
- 날짜와 시간을 객체 지향적으로 다루어 코드의 가독성과 유지보수성을 높입니다.
- 날짜/시간 간의 연산, 비교, 형식 변환 등 복잡한 작업에 매우 유용합니다.
- 시간대(timezone) 처리 기능을 지원하여 글로벌 애플리케이션 개발에 적합합니다.
- 단점:
- time 모듈에 비해 학습 곡선이 약간 더 있을 수 있습니다 (다양한 클래스와 메서드).
- 매우 단순한 시간 지연 등에는 time 모듈이 더 간편할 수 있습니다.
오늘의 실습
https://fastcampus.info/4n8ztzq
(~6/20) 50일의 기적 AI 환급반💫 | 패스트캠퍼스
초간단 미션! 하루 20분 공부하고 수강료 전액 환급에 AI 스킬 장착까지!
fastcampus.co.kr
'개발공부 > python' 카테고리의 다른 글
패스트캠퍼스 환급챌린지 13일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.13 |
---|---|
패스트캠퍼스 환급챌린지 12일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.12 |
패스트캠퍼스 환급챌린지 10일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.10 |
패스트캠퍼스 환급챌린지 8일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.08 |
패스트캠퍼스 환급챌린지 7일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (1) | 2025.07.07 |