*args
로 함수에 전달하는 방법:def example_function(*args):
for arg in args:
print(arg)
# 리스트나 튜플로 값을 저장
values = [1, 2, 3]
# *args로 리스트나 튜플의 값을 함수에 전달
example_function(*values)
def example_function(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
# 사전으로 값을 저장
kwargs = {
'arg1': 1,
'arg2': 2,
'arg3': 3
}
# **kwargs로 사전의 값을 함수에 전달
example_function(**kwargs)
Python에서 열거형(
Enum
)은 의미 있는 이름으로 고정된 값을 표현할 수 있는 강력한 기능입니다.Python 3.4부터 기본 모듈로 제공되며, 상태, 권한, 타입 등의 제한된 값 표현에 유용하게 쓰입니다.
from enum import Enum
class Status(Enum):
READY = 1
RUNNING = 2
DONE = 3
print(Status.READY.name) # 'READY'
print(Status.READY.value) # 1
# 비교
if my_status == Status.RUNNING:
print("작업 실행 중!")
for status in Status:
print(status.name, status.value)
# Enum 멤버 접근
print(Status['DONE']) # Status.DONE
print(Status(1)) # Status.READY
auto()
로 자동 값 지정from enum import Enum, auto
class Color(Enum):
RED = auto()
GREEN = auto()
BLUE = auto()
IntEnum
: 숫자처럼 비교 가능한 Enumfrom enum import IntEnum
class Level(IntEnum):
LOW = 1
MEDIUM = 2
HIGH = 3
if Level.HIGH > Level.MEDIUM:
print("높은 위험도!")
Flag
: 비트 연산용 Enumfrom enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
# 권한 조합
p = Permission.READ | Permission.WRITE
# 권한 포함 여부 확인
if Permission.WRITE in p:
print("쓰기 권한 있음")
class Status(Enum):
READY = 1
RUNNING = 2
DONE = 3
def is_final(self):
return self == Status.DONE
# 사용
if Status.DONE.is_final():
print("최종 상태입니다.")
@unique
from enum import Enum, unique
@unique
class Weekday(Enum):
MON = 1
TUE = 2
# WED = 1 # ValueError 발생!
Enum
기본 열거형IntEnum
정수와 비교 가능한 열거형Flag
, IntFlag
비트 연산이 필요한 경우 사용auto()
값 자동 할당@unique
중복 값 방지pkgutil
을 활용import numpy as np
import pandas as pd
import sklearn
import pkgutil
# 모든 서브 모듈 나열 함수
def list_all_modules(module):
"""
주어진 모듈의 모든 서브 모듈을 나열합니다.
'_로 시작하는 모듈은 제외합니다.
"""
module_name = module.__name__
return [
modname for importer, modname, ispkg in pkgutil.walk_packages(module.__path__, prefix=module_name + ".")
if not any(part.startswith("_") for part in modname.split("."))
]
for module in list_all_modules(sklearn):
print(module)
inspect
모듈을 활용import inspect
import numpy as np
# 모듈 내부의 함수 목록을 가져오는 함수
def list_all_functions(module):
"""
주어진 모듈의 모든 함수를 나열합니다.
'_로 시작하는 함수는 제외합니다.
"""
return [
name for name, obj in inspect.getmembers(module)
if inspect.isfunction(obj) and not name.startswith("_")
]
# 함수 목록 출력
for func in list_all_functions(np):
print(func)
import pkgutil
import inspect
def get_object_type(obj):
if inspect.ismodule(obj):
return "module"
elif inspect.isclass(obj):
return "class"
elif inspect.isfunction(obj):
return "function"
elif inspect.ismethod(obj):
return "method"
else:
return "unknown"
def list_all_classes(module):
return [(name, get_object_type(obj)) for name, obj in inspect.getmembers(module) if inspect.isclass(obj) and not name.startswith("_")]
def list_all_functions(module):
return [(name, get_object_type(obj)) for name, obj in inspect.getmembers(module) if inspect.isfunction(obj) and not name.startswith("_")]
def list_all_modules(module):
return [(name, get_object_type(obj)) for name, obj in inspect.getmembers(module) if inspect.ismodule(obj) and not name.startswith("_")]
def list_all(module):
return [(name, get_object_type(obj)) for name, obj in inspect.getmembers(module) if not name.startswith("_")]
typing
모듈을 사용하면 제네릭(generic)을 지원할 수 있습니다.T
는 임의의 타입을 나타내는 타입 변수일 수 있습니다.typing
모듈의 TypeVar
를 사용하여 정의됩니다.from typing import TypeVar
T = TypeVar('T')
def first_element(items: list[T]) -> T:
return items[0]
이 함수는 임의의 타입의 리스트를 인자로 받아 리스트의 첫 번째 요소를 반환합니다.
typing
모듈의 Generic
클래스를 상속하여 정의됩니다.from typing import TypeVar, Generic
T = TypeVar('T')
class Box(Generic[T]):
def __init__(self, item: T):
self.item = item
def get_item(self) -> T:
return self.item
이 클래스는 임의의 타입의 데이터를 보관하는 상자를 나타내며, get_item()
메서드를 통해 데이터를 반환합니다.
제네릭을 사용하면 코드를 더 일반적으로 작성할 수 있고, 타입 안정성을 유지하면서 코드를 유연하게 만들 수 있습니다. 따라서 제네릭은 Python에서 다양한 타입의 데이터를 처리하는 함수나 클래스를 작성할 때 매우 유용합니다.
Exception
: 모든 내장 예외의 기본 클래스입니다. 사용자 정의 예외를 만들 때 이 클래스를 상속하여 만들 수 있습니다.TypeError
: 데이터 형식이 잘못된 경우 발생하는 예외입니다.ValueError
: 데이터 값이 잘못된 경우 발생하는 예외입니다.IndexError
: 인덱스가 시퀀스 범위를 벗어난 경우 발생하는 예외입니다.KeyError
: 딕셔너리에서 존재하지 않는 키를 사용한 경우 발생하는 예외입니다.NameError
: 지역 또는 전역 이름을 찾을 수 없는 경우 발생하는 예외입니다.FileNotFoundError
: 파일을 찾을 수 없는 경우 발생하는 예외입니다.ZeroDivisionError
: 0으로 나누는 경우 발생하는 예외입니다.class MyCustomError(Exception):
def __init__(self, message="내가 만든 예외 발생!"):
self.message = message
super().__init__(self.message)
# 사용자 정의 예외 발생
try:
raise MyCustomError()
except MyCustomError as e:
print("사용자 정의 예외가 발생했습니다:", e.message)
raise
키워드를 사용합니다. 일반적으로 내장 예외 클래스 중 하나를 인스턴스화하여 발생시킵니다.raise ValueError("예외 발생!")
try
문과 except
문을 사용합니다.try
블록 안에는 예외가 발생할 수 있는 코드를 작성하고,except
블록 안에는 발생한 예외를 처리하는 코드를 작성합니다.try:
# 예외가 발생할 수 있는 코드
raise ValueError("예외 발생!")
except ValueError as e:
# 발생한 예외를 처리하는 코드
print("예외가 발생했습니다:", e)
except
문은 발생한 예외의 타입을 지정할 수 있습니다.ValueError
예외가 발생하면 해당 예외를 처리합니다.