인프런 커뮤니티 질문&답변

kks99502님의 프로필 이미지
kks99502

작성한 질문수

우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)

일급함수 - 데코레이터(4-2)

데코레이터 예제에 대한 질문입니다.

작성

·

204

0

def perf_clock(func): 

      def perf_clocked(*args): 

         #함수 시작 시간

         st = time.perf_counter()

         # 함수 실행

         result = func(*args)

         # 함수 종료시간

         et = time.perf_counter() -st

         # 실행 함수명

         name = func.__name__

         # 함수 매개변수(출력) (,로 구분해서 나옴)

         arg_str = ', '.join(repr(arg) for arg in args) 

         #결과 출력

         print('[%0.5fs] %s(%s) -> %r' % (et, name, arg_str, result))

         (return result)

    return perf_clocked

이 예제의 구조를 파악하며 실행 과정을 공부해봤습니다.

그래서 내부함수 perf_clocked에서 return result를 지워보고 실행을 해봤는데 데코레이터 실행에 문제가 없었습니다.

수업시간에 언급하신 것처럼 closure 구조인건 이해를 했는데  return result의 역할이 무엇인지 잘 모르겠습니다.

항상 친절한 답변에 감사드립니다. 

 

답변 3

0

return result 를 안하면 

print(time_func(1.5))
print(sum_func(100, 150, 250, 300, 350))

이렇게 했을때 출력이 None 으로 나옵니다. 리턴값을 사용하지 않는경우는 문제가 없지만 리턴값이 필요한 경우는 return result  가 필요합니다. sum_func 의 결과(1150)를 다른곳에서 사용하려면 리턴이 필요합니다.

이해하신 클로저 구조와 return result 의 있고 없음은 아무 상관이 없습니다.

0

kks99502님의 프로필 이미지
kks99502
질문자

답변 감사드립니다.

보내주신 링크로 클로저 관련 글들을 읽어보았습니다.

글을 읽으며 제가 궁극적으로 궁금했던 것은 클로저의 구조와 개념이었습니다. 

그래서 제가 궁금한 것은 1, 2 에서 차이점으로 'return result'는 예제의 클로저 구조에서 있어도 되고 없어도 되는 것이 아닌가요?

왜냐하면 제 생각은 result 값인 func(*args)를 실행한 결과 값을 프리변수에 저장하는 것이 아닌 func 자체를 저장하고 있다고 생각하기 때문입니다.

 

저의 나름대로 정리한 클로저는 프리변수에 상태, 결과, 인자 값들을 저장하고, 보이지 않지만 불러와서 활용하는 함수라고 생각합니다. 그래서 1번에서 '클로저는 def perf_clocked()함수'이고 '프리변수로 func을 저장 및 활용'하고 있다고 이해하고 있습니다.

혹시 제가 생각하는 클로저의 개념과 이해가 잘못되었는지 궁금합니다.  

1. 제가 생각하는 클로저 구조

# def perf_clock(func):

#     def perf_clocked(*args):

#     return perf_clocked

2. 강의에서 설명해주신 클로저 구조

# def perf_clock(func):

#     def perf_clocked(*args):

#         return result

#     return perf_clocked

항상 좋은 답변 감사드립니다. 

오늘도 좋은 하루되세요 

0

좋은사람님의 프로필 이미지
좋은사람
지식공유자

클로저가 이해가 안되면 이어지는 데코레이터 제네레이터 코루틴 전부 이어져 있습니다.

이해하기 쉬운 글을 토대로 한 번 읽어보세요

https://www.google.com/search?q=%ED%8C%8C%EC%9D%B4%EC%8D%AC+%ED%81%B4%EB%A1%9C%EC%A0%80&oq=%ED%8C%8C%EC%9D%B4%EC%8D%AC+%ED%81%B4%EB%A1%9C%EC%A0%80&aqs=chrome..69i57.1488j0j15&sourceid=chrome&ie=UTF-8

kks99502님의 프로필 이미지
kks99502

작성한 질문수

질문하기