*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)
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
예외가 발생하면 해당 예외를 처리합니다.