본문 바로가기
프로그래밍/Python

[Python] 10. Python의 "고급 주제"

by iwbap 2024. 6. 18.
728x90

Python 학습: 고급 주제

Python은 강력한 고급 기능을 제공하여 더 복잡하고 효율적인 프로그램을 작성할 수 있도록 합니다. 이번 글에서는 데코레이터, 제너레이터, 컨텍스트 매니저에 대해 알아보겠습니다.


1. 데코레이터: 함수 데코레이터와 클래스 데코레이터

데코레이터는 함수를 수정하거나 확장하는데 사용되는 디자인 패턴입니다. 함수와 클래스에 데코레이터를 적용하여 코드의 재사용성을 높이고, 기능을 확장할 수 있습니다.

 

- 함수 데코레이터 : 함수 데코레이터는 다른 함수를 인자로 받아서 새로운 함수를 반환하는 함수입니다.

 

함수 데코레이터 예제

[python]
 
def my_decorator(func):
    def wrapper():
        print("함수 호출 전")
        func()
        print("함수 호출 후")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()
 

위의 예제에서 my_decorator는 say_hello 함수를 감싸서 호출 전후에 메시지를 출력합니다. @my_decorator 구문을 사용하여 say_hello 함수에 데코레이터를 적용합니다.

 

 

- 클래스 데코레이터 : 클래스 데코레이터는 클래스의 정의를 수정하는 데 사용됩니다.

 

클래스 데코레이터 예제

[python]
 
def add_methods(cls):
    def new_method(self):
        return "새로운 메서드 추가됨"
    cls.new_method = new_method
    return cls

@add_methods
class MyClass:
    def __init__(self, name):
        self.name = name

obj = MyClass("Test")
print(obj.new_method())
 

위의 예제에서 add_methods 데코레이터는 클래스에 새로운 메서드를 추가합니다. @add_methods 구문을 사용하여 MyClass 클래스에 데코레이터를 적용합니다.


2. 제너레이터: yield, 제너레이터 함수

제너레이터는 이터레이터를 생성하는 함수로, yield 키워드를 사용하여 값을 하나씩 반환합니다. 제너레이터는 메모리 효율성이 뛰어나며, 큰 데이터셋을 처리할 때 유용합니다.

 

제너레이터 함수 예제

[python]
 
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()

for value in gen:
    print(value)
 

위의 예제에서 my_generator 함수는 yield 키워드를 사용하여 값을 하나씩 반환합니다. for 루프를 사용하여 제너레이터에서 값을 반복해서 얻을 수 있습니다.

 

 

- 제너레이터와 메모리 효율 : 제너레이터는 큰 데이터를 처리할 때 메모리 효율성을 높여줍니다. 예를 들어, 제너레이터를 사용하여 큰 범위의 숫자를 생성할 수 있습니다.

 

제너레이터와 메모리 효율 예제

[python]
 
def large_range(n):
    for i in range(n):
        yield i

gen = large_range(1000000)

print(next(gen))  # 0 출력
print(next(gen))  # 1 출력
print(next(gen))  # 2 출력
 

위의 예제에서 large_range 제너레이터는 큰 범위의 숫자를 메모리 효율적으로 생성합니다. next 함수를 사용하여 제너레이터에서 값을 하나씩 가져올 수 있습니다.


3. 컨텍스트 매니저: with 구문, __enter__, __exit__

컨텍스트 매니저는 리소스를 관리하는 데 사용되는 구조입니다. with 구문을 사용하여 컨텍스트 매니저를 구현할 수 있으며, __enter__와 __exit__ 메서드를 정의합니다.

 

컨텍스트 매니저 예제

[python]
 
class MyContextManager:
    def __enter__(self):
        print("컨텍스트 진입")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("컨텍스트 종료")

with MyContextManager() as manager:
    print("컨텍스트 내부 코드 실행")
 

위의 예제에서 MyContextManager 클래스는 __enter__와 __exit__ 메서드를 정의하여 컨텍스트 매니저를 구현합니다. with 구문을 사용하여 컨텍스트 매니저를 사용할 수 있습니다.

 

 

파일 처리 예제 : 컨텍스트 매니저는 파일 처리와 같은 리소스 관리에 매우 유용합니다.

[python]
 
with open("example.txt", "w") as file:
    file.write("Hello, World!")
 

위의 예제에서 with 구문을 사용하여 파일을 열고, 파일 작업이 끝난 후 자동으로 파일을 닫습니다.


이 글에서는 Python의 고급 주제인 데코레이터, 제너레이터, 컨텍스트 매니저에 대해 알아보았습니다. 이러한 고급 기능을 이해하고 활용하면 더 효율적이고 구조적인 코드를 작성할 수 있습니다. Happy Coding!

728x90