Python/파이썬 기초

파이썬 함수 안에 함수(중첩함수) 선언 예제, 변수 범위 원리

jimmy_AI 2022. 4. 17. 21:11
반응형

파이썬 중첩함수 사용법 및 원리

파이썬에서 함수 내부에 또 다른 함수를 선언하는 중첩함수라는 개념에 대하여

작동 원리 및 변수의 범위를 간단한 예제를 통해 이해해보도록 하겠습니다.

 

 

함수 안의 함수 사용 예시

def 내에 def 구문을 사용하는 식으로 중첩함수를 쉽게 선언할 수 있습니다.

(lambda 형태를 사용하여 함수 내부 함수를 선언하는 것도 가능합니다.)

 

숫자 n을 input으로 넣으면 n을 더하는 내부 함수를 반환하는 함수의 예시는 아래와 같습니다.

def make_func(n):

    def add_n(x):
        return x + n
    
    return add_n

참고로, def 내에 lambda를 사용한 케이스, lambda 내 lambda를 활용한 경우의

아래 선언 코드들도 모두 위의 코드와 같은 결과가 나타납니다.

# 위와 같은 경우 1
def make_func(n):
    return lambda x : x + n

# 위와 같은 경우 2
make_func = lambda n : lambda x : x + n

 

위에서 선언한 make_func로 값 하나를 받아 5를 더하여 반환받는 my_func

7을 빼서 반환받는 my_func2를 생성하여 사용해 본 결과는 다음과 같았습니다.

# 5를 더하는 함수
my_func = make_func(5)

my_func(10) # 15
my_func(20) # 25

# 7을 빼는 함수
my_func2 = make_func(-7)

my_func2(10) # 3
my_func2(20) # 13
반응형

중첩함수 변수 범위

위의 make_func 함수에서 n과 x는 모두 함수 내에서만 사용 가능한 지역 변수입니다.

 

다만, n은 바깥쪽의 함수(make_func)에서 선언되어 make_func 전체에서 사용이 가능하지만,

x는 안쪽 함수(add_n)에서 선언되어 add_n 내에서만 사용이 가능하다는

사용 가능 범위의 차이가 있습니다. 이를 그림으로 요약하면 아래와 같습니다.

각 지역 변수의 사용 가능 범위를 표시한 그림

만일, x를 아래 코드처럼 add_n 부분이 종료된 후 사용을 시도할 경우

NameError가 발생하게 되는 것을 확인할 수 있습니다.

def make_func(n):

    def add_n(x):
        return x + n
    
    print(x) # 여기서 오류 발생(x 사용 가능 범위 이탈)
    return add_n

my_func = make_func(5) # NameError: name 'x' is not defined