클로저란?
- 클로저는 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
'데이터 > Python' 카테고리의 다른 글
[코딩테스트 준비] 코딩테스트 입문자 '코드트리' 사용후기 (0) | 2024.03.02 |
---|---|
tqdm을 라이브러리 사용하여 진행률 시각화하기 (0) | 2024.02.03 |
[파이썬] 클래스 사용하기 (0) | 2023.06.18 |
[파이썬] 리스트 (0) | 2022.05.12 |