본문 바로가기

데이터/Python

[파이썬/Python] 클로저, closure

클로저란?

- 클로저는 Outer function이 종료된 후에도 Outer function에 접근할 수 있는 함수(nested function)이다.

- 즉, 지역함수가 종료된 후에도 지역함수의 변수에 접근할 수 있게 한다.

- 클로저의 특성 : 불변자료구조이며, 멀티스레드 프로그래밍에 강점이 있다.

 

언제 사용하는가?

클로저는 전역 변수의 사용을 피하고, 데이터의 숨김(data hiding)을 제공하고, 몇몇 메서드들에 솔루션을 제공한다.

- 데코레이터와 함께 사용하면 높은 확장성을 제공한다.

- 여러 속성과 메서드들이 있는 경우에는 클래스 구현이 권장된다.

 

 

 

def greet(name):
    # inner function
    def display_name():
        print("Hi", name)
    
    # call inner function
    display_name()

# call outer function
greet("John")  

# Output: Hi John

- display_name()함수가 greet()함수 내에 작성되어있다. display_name()함수가 nested function이다.

- 일반적인 함수와 같은 모양이지만 greet()함수가 실행되야 실행될 수 있다.

 

클로저 사용

- 숫자형 값들을 입력하면, 그 전의 값들에 더해서 값들의 수를 나눠 평균을 구하는 함수를 생성해보자

 

클로저를 사용하지 않고 만들 경우

- 전역함수가 아닌 지역함수로 구현한다고 생각하면, 지역함수가 종료될 때 지역변수가 사라져서 다음과 같은 클래스 구조로 만들 수 있을 것이다.

 

# 클래스 이용
class Averager():
	def __init__(self):
		self._series = []
	
	def __call__(self, v): # 클래스를 함수처럼 사용할 수 있다
		self._series.append(v)
		print('inner >> {} / {}'.format(self._series, len(self._series)))
		return sum(self._series) / len(self._series)

# 인스턴스 생성
averager_cls = Averager()

# 누적
print(averager_cls(10)) # 클래스를 call
print(averager_cls(30))
print(averager_cls(50))
print(averager_cls(70))

출력값

inner >> [10] / 1
10.0
inner >> [10, 30] / 2
20.0
inner >> [10, 30, 50] / 3
30.0
inner >> [10, 30, 50, 70] / 4
40.0

 

 

클로저를 사용할 경우

- 함수 내에 nested function을 만들어서 구동하고,

- Outer 함수에 값들을 저장할 변수를 선언한다. -> 이 부분을 Free variable(자유변수)영역 이라고 한다

def closure_ex1():
	# Free variables
	# 클로저 영역
	series = []
	def averager(v):
		series.append(v)
		print('inner >>> {} / {}'.format(series, len(series)))
		return sum(series) / len(series)
	return averager

avg_closure1 = closure_ex1()

print(avg_closure1)
print(avg_closure1(10))
print(avg_closure1(30))
print(avg_closure1(50))

출력값

<function closure_ex1.<locals>.averager at 0x1048ed9d0>
inner >>> [10] / 1
10.0
inner >>> [10, 30] / 2
20.0
inner >>> [10, 30, 50] / 3
30.0

 

 

 

참고 : https://www.programiz.com/python-programming/closure

https://www.inflearn.com/course/프로그래밍-파이썬-중급-인프런-오리지널/

 

우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original) - 인프런 | 강의

본 강의는 파이썬 기초를 배운 학습자가 파이썬을 실무에 활용할 수 있도록 수준 높은 문법을 배우는 데 중점을 두고 있습니다. 파이썬만의 차별점을 파악하고 빠르게 익힘으로써 중급 레벨의

www.inflearn.com

 

Python Closures (With Examples)

Learn to code by doing. Try hands-on Python with Programiz PRO. Claim Your Discount

www.programiz.com