파이썬 특수 문법(데코레이터, 이터레이터등) - . 중첩 함수 (Nested function)

15. 중첩 함수 (Nested function)

  • 함수 내부에 정의된 또 다른 함수
  • 중첩함수는 해당 함수가 정의된 함수 내에서 호출 및 반환 가능
  • 함수 안에 선언된 변수는 함수 안에서만 사용 가능한 원리와 동일 (로컬 변수)
In [1]:
def outer_func():
    print('call outer_func function')
    
    # 중첩 함수의 정의
    def inner_func():
        return 'call inner_func function'
    
    # 중첩 함수 호출 
    print(inner_func())
In [2]:
outer_func()
call outer_func function
call inner_func function
초간단 연습1
outer_func() 함수의 출력을 보면서 왜 이렇게 출력이 되었는지 생각해보기~
In [3]:
# 중첩함수는 함수 밖에서는 호출 불가 (outer_func 함수 안에서 선언되었으니, outer_func 함수 안에서만 호출 가능)
inner_func()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-3-29421a275ed3> in <module>()
      1 # 중첩함수는 함수 밖에서는 호출 불가 (outer_func 함수 안에서 선언되었으니, outer_func 함수 안에서만 호출 가능)
----> 2 inner_func()

NameError: name 'inner_func' is not defined

그런데 중첩함수를 함수 밖에서도 호출할 수 있는 방법이 있다. 이 방법을 이해하기 위해 First-class function, closure 에 대해 다음 장에서 알아보자.



In [5]:
def outer_func(num):
    # 중첩 함수에서 외부 함수의 변수에 접근 가능
    def inner_func():
        print(num)
        return 'complex'
    
    return inner_func

fn = outer_func(10)    # <--- First-class function
print(fn())            # <--- Closure 호출 
10
complex