파이썬(Python)/문법

파이썬 함수 안에 중첩(nested)해서 함수 넣기

끄적끄적아무거나 2021. 4. 21. 19:33
반응형

함수 안에 함수 중첩해서 넣기 예제와 특징


예제1 코드>>

def a_func():
    def b_func():
        print("it's b_func")
    print("it's a_func")
    b_func()

a_func()
# b_func() #주석처리

결과>>
it's a_func
it's b_func

예제1 코드 주석>>

위 코드 예제는 a_func 함수 안에 b_func 함수를 넣어서 실행하고 있다.

a_func()에 의해 함수가 실행되었다고 생각하자. 그러면 해당함수는 컴퓨터 메모리의 스택(Stack)이라는 공간에 저장되어 실행 된다. 스택의 a_func 함수 시작점 주소부터 코드가 진행되는데 그 내부에서 b_func 함수도 선언된다. 그리고 print("it's a_func") 가 실행되고 b_func() 함수가 순차적으로 실행된다. 결과는 위의 코드에 나와 있는 것과 같다.

 

 


예제2 코드>>

def a_func():
    def b_func():
        print("it's b_func")
    print("it's a_func")
    b_func()

a_func()
b_func()

결과>>
NameError: name 'b_func' is not defined

 

예제2 코드 주석>>

이번에는 a_func(), b_func() 를 모두 실행하였다.  하지만 b_func는 정의되지 않았다고 출력되었다. 이유는 a_func()를 실행하여 해당 함수가 스택(stack)에 저장되었지만 실행이 종료되면 해당 함수는 Stack에서 지워진다. 그러므로 b_func()는 찾을 수 없게 된다. 

 

 


예제3 코드>>

def a_func(a):
    def b_func(b):
        print(b)
    print(a)
    return b_func

a_var = a_func("it's a_func")
a_var("it's b_func")

결과>>
it's a_func
it's b_func

 

예제3 코드 주석>>

앞서 함수가 실행되면 스택에 저장되었다가 함수가 종료되면서 지워진다고 하였다. 만일 해당 함수를 지워지지 않게 계속 쓰고 싶다면 위 코드처럼 해당 함수를 변수에 넣고 실행하면 된다. 변수에 들어간 함수는 메모리 영역에서 변수부분에 할당된 주소에 들어가기 때문에 코드가 실행되는 동안에는 유지된다. 그래서 위 파이썬 코드처럼 a_var 변수에 함수를 저장하고 return으로 받은 b_func를 저장한다. 그리고 인자 값으로 넣으면 b_func를 계속 사용할 수 있게 된다. 

 

 

 

반응형