Python 중급

김신영·2024년 6월 1일
0
post-thumbnail
post-custom-banner

*agrs, **kwargs

  • 리스트나 튜플로 로컬 변수에 값을 저장한 후, *args로 함수에 전달하는 방법:
def example_function(*args):
    for arg in args:
        print(arg)

# 리스트나 튜플로 값을 저장
values = [1, 2, 3]

# *args로 리스트나 튜플의 값을 함수에 전달
example_function(*values)
  • dict으로 로컬 변수에 값을 저장한 후, `kwargs`로 함수에 전달하는 방법**:
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)

파이썬 라이브러리 Package, Module 파악하기

  • 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("_")]

Generic

  • Python의 typing 모듈을 사용하면 제네릭(generic)을 지원할 수 있습니다.
  • 제네릭은 다양한 타입의 데이터를 처리하는 함수나 클래스를 작성할 때 유용합니다.

Type Variable (TypeVar)

  • Generic은 TypeVar를 사용하여 다양한 타입의 데이터를 처리할 수 있습니다.
  • TypeVar는 함수나 클래스에서 일반적으로 사용되는 변수이며, 타입 힌트로 사용됩니다. 보통 대문자 알파벳으로 표현됩니다.
  • 예를 들어, T는 임의의 타입을 나타내는 타입 변수일 수 있습니다.

제네릭 함수(Generic Function):

  • 제네릭 함수는 타입 변수를 사용하여 다양한 타입의 인자를 처리할 수 있습니다. 이러한 함수는 typing 모듈의 TypeVar를 사용하여 정의됩니다.
  • 예를 들어, 다음은 제네릭 함수의 예시입니다.
from typing import TypeVar

T = TypeVar('T')

def first_element(items: list[T]) -> T:
    return items[0]

이 함수는 임의의 타입의 리스트를 인자로 받아 리스트의 첫 번째 요소를 반환합니다.

제네릭 클래스(Generic Class):

  • 제네릭 클래스는 클래스 내부에서 타입 변수를 사용하여 다양한 타입의 데이터를 처리할 수 있습니다. 이러한 클래스는 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

내장 예외 클래스

  • 파이썬에서는 이미 다양한 내장 예외 클래스가 제공됩니다.
  • 이러한 내장 예외 클래스는 다양한 예외 상황을 다루기 위해 미리 정의되어 있으며, 사용자가 직접 예외 클래스를 정의하지 않고도 예외를 발생시킬 수 있습니다.
    • Exception: 모든 내장 예외의 기본 클래스입니다. 사용자 정의 예외를 만들 때 이 클래스를 상속하여 만들 수 있습니다.
    • TypeError: 데이터 형식이 잘못된 경우 발생하는 예외입니다.
    • ValueError: 데이터 값이 잘못된 경우 발생하는 예외입니다.
    • IndexError: 인덱스가 시퀀스 범위를 벗어난 경우 발생하는 예외입니다.
    • KeyError: 딕셔너리에서 존재하지 않는 키를 사용한 경우 발생하는 예외입니다.
    • NameError: 지역 또는 전역 이름을 찾을 수 없는 경우 발생하는 예외입니다.
    • FileNotFoundError: 파일을 찾을 수 없는 경우 발생하는 예외입니다.
    • ZeroDivisionError: 0으로 나누는 경우 발생하는 예외입니다.

Exception 클래스 만들기

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 키워드를 사용합니다. 일반적으로 내장 예외 클래스 중 하나를 인스턴스화하여 발생시킵니다.
raise ValueError("예외 발생!")

try, except

  • 예외를 처리하기 위해서는 try 문과 except 문을 사용합니다.
    • try 블록 안에는 예외가 발생할 수 있는 코드를 작성하고,
    • except 블록 안에는 발생한 예외를 처리하는 코드를 작성합니다.
try:
    # 예외가 발생할 수 있는 코드
    raise ValueError("예외 발생!")
except ValueError as e:
    # 발생한 예외를 처리하는 코드
    print("예외가 발생했습니다:", e)
  • 여기서 except 문은 발생한 예외의 타입을 지정할 수 있습니다.
    • 위의 예제에서는 ValueError 예외가 발생하면 해당 예외를 처리합니다.
profile
Hello velog!
post-custom-banner

0개의 댓글