클로저
함수가 종료되어도 자원(변수)을 사용할수 있는 함수
내부함수란 무엇일까?
함수안에서 정의되는 함수
def out():
def in():
위의 코드처럼 함수 안에 또 다른 함수를 정의했을때 안에 있는
in이라는 함수는 내부함수이다.
클로저
함수가 종료되어도 자원(변수)을 사용할수 있는 함수
클로저가 될수 있는 3가지 조건
1.내부함수여야한다.
2.외부함수의 변수를 참조해야한다.
3.외부함수가 내부함수를 반환해야한다.
def out(a):
def in():
print(a)
return in
#1.내부함수
#함수 안에 또다른 함수를 정의
def outer(name):
def inner():
print(name, "님 안녕")
return inner
#함수자체는 일급객체이므로 변수에 할당이 가능하다.
func =outer("ehdus")
func()
# 먼저 outer()가 실해된다 그리고 반환값으로 inner를 반환하고
# 그러면
# func = inner
# func에 inner를 할당하고 func은 inner를 가르키고 있다.
# 그리고 func()는 inner를 호출하는 것과 같다.
# 특징 outer는 inner를 반환하고 끝이 났는데 inner는 outer의name변수를 사용한다.
# 클로저 안에 name이라는 변수가 들어가 있다.
# 그러므로 inner()함수는 클로저함수이다.
# 2.클로저
# 함수가 종료되어도 자원을 사용할 수 있는 함수
# **클로저 될 조거
# 1) 내부함수 여야 한다.
# 2) 외부함수의 변수를 참조해야한다. ==> name이라는 외부함수 변수를 참조하고 있다.
# 3) 외부함수가 내부함수를 반환해야 한다. ==> 외부함수가 내부함수를 반환하고 있다.
def greeting(name, age, gender):
def inner():
print(name, "안녕하세요")
print(age, "안녕하세요")
print(gender, "안녕하세요")
return inner
closure = greeting("누구세요","10","male")
closure()
# print(closure.__closure__[0].cell_contents)
for i in closure.__closure__: #closure.__closure__의 데이터 타입이 튜플이다.
print(i.cell_contents)
*참고
전역변수를 사용해서 대체가 가능하다.
하지만 전역변수 사용을 최소화하는 것이 좋다(네이밍문제,스코프문제)
함수마다 자기의 스코프안에 변수들을 저장해 두고 싶을때 사용한다.
클래스를 이용해서 대체 가능하다.
기본적인 개념을 숙지하도록하자