[Python] 파이썬 일급 함수#2

아직·2022년 6월 8일
0
post-thumbnail

1)

#클래스 이용
class Averager():
    def __init__(self):
        self._series = []

    def __call__(self, v):
        self._series.append(v)
        print('inner >>{} / {}'.format(self._series, len(self._series)))
        return sum(self._series) / len(self._series)

#인스턴스 생성
averager_cls = Averager()

#누적
print(averager_cls(10))

#클로저 이용
def closure_ex1():
    # Free variable, 자유 변수
    # 클로저 영역
    series = []
    def averager(v):
        series.append(v)
        print('inner >>> {} / {}'.format(series, len(series)))
        return sum(series) / len(series)
    return averager #일급 함수 특징 중 '함수를 결과로 반환 가능'이 있었다.

avg_closure1 = closure_ex1()
print(avg_closure1(30))

클래스를 사용했을 때는 "나 이렇게 만들어 둔 원본을 인스턴스라는 복제품으로 사용할래"로 이해된다. 반면, 클로저에서는 "avg_closure1 = closure_ex1()"을 입력해서 'return 함수' 과정을 한 번 거치면서(사실상 클로저 영역의 변수 고정 및 참조하는 작업을 거치므로 '자유 변수'라는 단어는 중요해 보인다.) "이제 averager(v)에 들어가는 변수랑, closure_ex1()에 변수 둘 다 사용할래" 후 야심찬 작업을 해주게 된다.

https://changhyeonnam.github.io/2021/11/21/closure_nonlocal.html 참고

2)

#데코레이터 미사용
def time_func(seconds):
    time.sleep(seconds)

def sum_func(*numbers):
    return sum(numbers)
    
none_deco1 = perf_clock(time_func)
none_deco2 = perf_clock(sum_func)

print(none_deco1, none_deco1.__code__.co_freevars)
print(none_deco2, none_deco2.__code__.co_freevars)

print('-' * 40, 'called none decorator -> time_func')
print()
none_deco1(1.5)
print('-' * 40, 'called none decorator -> sum_func')
print()
none_deco2(100, 200, 300, 400, 500)
#데코레이터 사용

@perf_clock 
def time_func(seconds):
    time.sleep(seconds)

@perf_clock
def sum_func(*numbers):
    return sum(numbers)

print('-' * 40, 'called decorator -> time_func')
print()
time_func(1.5)
print('-' * 40, 'called decorator -> sum_func')
print()
sum_func(100, 150, 200, 300, 500)

classmethod에서 이미 데코레이터를 사용한 적이 있다. 데코레이터를 사용하지 않으면 outer 함수의 자유 변수를 고정하고, 내가 원하는 함수와 연동해서 사용하기 위한 사전 작업이 필요하다. 그러나 @perf_clock을 사용함으로써 "원 함수인 나를 outer 함수의 인자에 나를 넣어줘."라는 연동-주문을 간편하게 할 수 있다. 또한 outer 함수를 통해 inner 함수와 연동된 '어떤 함수'가 아닌, 원 함수를 그대로 사용할 수 있다는 점도 주목하자.

0개의 댓글