패스트캠퍼스 한 번에 끝내는 파이썬 웹 개발 초격차 패키지 pt2 - 클로저

정영찬·2022년 2월 11일
0

내부함수?

  • 함수 안에서 정의되는 함수

클로저?

  • 함수가 종료되어도 자원(변수)을 사용할수 있는 함수

조건

  • 내부 함수여야한다.
  • 외부 함수의 변수를 참조해야 한다.
  • 외부 함수가 내부함수를 반환해야한다.
# 1. 내부함수
# 함수 안에 또다른 함수를 정의할 수 있다.


def outer(name):
    def inner():
        print(name,"님 안녕하세요!")
    
    return inner

func = outer("startcoding")
func()


# 2. 클로저
# 함수가 종료되어도 자원을 사용할 수 있는 함수

# 내부 함수여야한다.
# 외부 함수의 변수를 참조해야 한다.
# 외부 함수가 내부함수를 반환해야한다.


def greeting(name, age, gender):
    def inner():
        print(name, "님 안녕하세요!")
        print("나이", age )
        print("성별", gender)
    return inner

closure = greeting('나미', 27, 'female' )
closure()

closure 객체에서 greeting 함수는 inner를 호출함으로써 종료가 되었으면 name, age, gender 파라미터의 데이터는 어디에 저장이 되는걸까?

closure 객체 안에 뭐가 있는지 확인해보자

print(dir(closure))

라고 입력후 실행을 하면

위의 목록이 출력되는데 그중에서 __closure__ 를 살펴보자
해당 요소의 타입을 알아보면 튜플 타입인 것을 알수 있다

print(type(closure.__closure__)) // <class 'tuple'>

이 튜플안의 내용을 한번 살펴보면

print(dir(closure.__closure__[0]))


위와 같고, 그중에서 cell_contents 속성을 출력해보면

print(closure.__closure__[0].cell_contents) //27

27 이라는 값을 출력한다.

※ 클로저 함수를 반환하는 함수의 객체에서 외부에서 받은 데이터는
객체.__closure__[i].cell_const 내부에 데이터를 저장해 놓는다는 것을 알 수 있다. 이때, i 는 처음에 정의한 외부함수의 파라미터 최대갯수 까지 작성 가능하다.

만약 __closure__ 의 전체요소의 cell_contents를 출력시켜보면 출력값은 객체를 만들었을 때 외부함수 파라미터에 지정한 데이터와 일치하는 것을 볼 수 있다.

for  i in closure.__closure__:
    print(i.cell_contents)  //  출력값 : 27 female 나미
profile
개발자 꿈나무

0개의 댓글