Python의 함수는 값이며, 몇 가지 추가적인 특징(변수 할당, 매개변수 전달, 반환값으로 사용 가능 등) 때문에 일급 객체
로 분류할 수 있습니다. Python은 함수 안에 함수를 정의할 수 있으며, 그렇게 정의된 내부 함수는 외부 함수의 문맥에 접근할 수 있습니다. 쉽게 말하면, 외부 함수가 가지고 있는 지역변수에 접근할 수 있다는 것입니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def calculator(fn=None, a=0, b=0): | |
def sum(): | |
return a + b | |
if fn: | |
return fn(a, b) | |
else: | |
return sum() | |
print(calculator(lambda a, b: a - b, 1, 3)) | |
# -2 | |
print(calculator(a=1, b=3)) | |
# 4 |
calculator
라는 함수를 정의했고, 이 함수는 두 개의 인자를 받아 처리하는 함수 fn, 두 정수 a, b를 받습니다. 함수 내부에는 sum
함수가 정의되어 있습니다.
- 만약 fn이 전달되었다면(if fn) 인자 a와 b를 전달하며 해당 함수 fn을 호출하고, fn의 반환값을 반환합니다.
- 만약 fn이 전달되지 않았다면(else) 내부 함수인 sum을 호출합니다.
함수의 인자로 함수를 전달하는 일은 낯설지 않지만, calculator
함수의 내부 함수인 sum
함수는 아무 인자를 받지 않았음에도 변수 a와 b에 접근할 수 있습니다. 이처럼 내부 함수가 외부 함수의 지역변수에 접근할 수 있는 것을 클로저(Closure)
라고 하며, 데코레이터와 같은 Python의 고급 개념들을 위해 필수적으로 사용됩니다.
'Python 계열 > Python 레거시 글' 카테고리의 다른 글
[Python] Iterable, Sequence, Iterator (0) | 2018.07.22 |
---|---|
[Python] Decorator (0) | 2018.07.21 |
[Python] 문자열의 메모리 할당 방식 (0) | 2018.07.19 |
[Python] 함수 인자의 기본값 평가 (0) | 2018.07.14 |
[Python] @property와 setter (0) | 2018.07.13 |