TIL18 | Python_중첩함수, closure와 decorator

이정아·2021년 9월 17일
0

Python

목록 보기
9/20
post-thumbnail

1. 중첩함수란?

  • 함수 내부에 정의된 또 다른 함수를 말합니다.
  • 중첨함수는 상위 부모함수 안에서만 호출 가능합니다.
def parent_function():
    def child_function():
        print("this is a child function")

    child_function()

#부모함수 호출 결과
parent_function()
> "this is a child function"


2. 클로져 (closure)

  • 부모 함수의 변수나 정보를 가두어 사용합니다.

클로져 조건

  • 중첩함수는 부모함수의 변수나 정보를 사용해야 합니다.
  • 부모함수는 중첩함수를 return 합니다.
def generate_power(base_number):   
    def nth_power(power):          
        return base_number ** power
    return nth_power                
    

# closure 생성 및 출력

power_of_two = generate_power(2)
# 부모함수의 변수인 base_number가 중첩함수에 격리되어 사용됨 => closure

power_of_two(7) 
# base_number가 2로 이미 셋팅 되어 있는 함수 

>>> 128
# 2^7 = 128


3. 데코레이터 (decorator)

  • 함수를 인자로 받아 새로운 함수를 만들어 반환하는 함수
  • 특정 함수의 전/후에 원하는 기능을 추가할 수 있다.
import time

# 함수의 수행시간을 출력해주는 데코레이터
def elapsed(func): # 함수를 인수로 받는다.
    def wrapper():
        start = time.time()
        func()     # 함수를 수행한다.
        end = time.time()
        print("함수 수행시간: %f 초" % (end - start))  # 함수의 수행시간을 출력한다.
        
    return wrapper

@elapsed    # @decorator함수이름
def myfunc():
    print("함수가 실행됩니다.")

myfunc()
>>> 함수가 실행됩니다.
>>> 수행시간: 0.000005# 동작원리
# decorated_myfunc = elapsed(myfunc)
# decorated_myfunc()

클로져와의 차이

  • 데코레이터는 함수를 인자로 받는다는 차이가 있습니다.





예제)
greeting 함수에 적용될 decorator 함수를 구현하여 greeting 함수에 적용해주세요.

greeting 함수가 호출 되었을때 decorator 함수에 parametor 값이 greeting 함수 리턴값의 다음에 붙혀져서 리턴되어야 합니다.

Decorator 함수의 이름은 welcome_decorator 여야 합니다.

예를 들어, 다음 처럼 정의 하여 welcome_decorator decorator를 적용하여 greeting을 호출하면:

@welcome_decorator
def greeting():
    return "Hello, "

greeting()

결과값은 다음과 같아야 합니다.

"Hello, welcome to WECODE!"

내가 작성한 코드👇

def welcome_decorator(func):
  def wrapper():
    return func()+"welcome to WECODE!"
    	# greeting()+"welcome to WECODE!" 
  return wrapper


@welcome_decorator
def greeting():
  return "Hello, "

의문점❓

처음에 return wrapper 뒤에 ()괄호를 붙이고 오류가나서 지웠더니 해결이 됐다.
return wrapper 뒤에 ()괄호가 없는데 wrapper 중첩함수가 어떻게 호출이 되는걸까?


해결
https://velog.io/@wjddk97/%ED%95%A8%EC%88%98%EB%A5%BC-return%ED%95%A0-%EB%95%8C-%EA%B4%84%ED%98%B8-%EC%9C%A0%EB%AC%B4-%EC%B0%A8%EC%9D%B4

0개의 댓글