본문으로 바로가기

Python 클로저(closure) 이해하기

category Python/python 파헤치기 2019. 6. 11. 09:00

클로저(closure)란 자신이 정의된 스코프에 있는 변수를 참조하는 함수이다.

파이썬은 클로저를 지원한다.

이 포스팅은 Python의 클로저의 특성을 이해하기 위하여 작성되었으며,

"파이썬 코딩의 기술"이라는 책을 참고하였고

나중에 다시 보아도 이해하기 쉽도록 지금 내가 이해한 바를 바탕으로 설명을 추가하였다.


코드를 보고 클로저를 이해하자

1
2
3
4
5
6
7
8
9
10
11
12
13
def sort_priority(values, group):
    def helper(x):
        if x in group:
            return (0, x)
        return (1, x)
    values.sort(key=helper)
    print(values)
 
 
numbers = [83125476]
group = {2 ,357# 우선 순위가 높은 아이템
sort_priority(numbers, group)
print(numbers)  # [2, 3, 5, 7, 1, 4, 6, 8]
cs

무엇을 위한 코드인가

 위의 코드에서는 리스트인 numbers를 파이썬에 내장된 sort 메서드를 사용하여 정렬하고 있다(line : 6). 위 코드에서는 단순히 numbers의 원소들의 크기 값을 비교하여 정렬하진 않는다. group 집합에 존재하는 우선순위 숫자들은 값에 상관없이 앞에 놓여야 하므로 사실상 정렬를 하는 조건이 2개인 셈이다. group 집합에 존재하는 값들을 앞에 정렬하고, (기존의 정렬 상태는 유지시키고) 그 안에서 다시 한번 원소의 크기에 따라 정렬한다. 이를 위해 클로저 함수 helper를 활용한다.

 코드를 이해해보자

 클로저 함수 helper를 이해해보자. sort_priority 함수를 보자. line 6번째 줄에서 sort 메서드의 key 인자로 helper 함수를 넘기고 있다(key=helper). 이때 helper 함수의 인자 값(x)으로는 values(파라미터로 전달된 numbers)의 원소들이 하나씩 전달된다. 그런데 helper 함수의 인자는 x 뿐인데 어디선가 튀어나온 group 변수가 사용되고 있다(line:3). 이게 무슨 일인가. helper 함수가 외부 함수인 sort_priority의 파라미터로 전달된 변수 group을 참조하고 있다. 그리고 아주 자연스럽게 helper 함수는 x가 group에 속해있는지를 판단하고(line : 3) 조건에 따라 적절한 튜플을 반환하고 있다. helper 함수가 group을 참조할 수 있는 것은 helper 함수가 클로저 함수이기 때문이다.

helper 함수의 반환값인 튜플은 리스트에 있는 각 아이템을 정렬하는데 활용된다. 파이썬에서는 튜플을 비교하는 특정한 규칙이 있는데, 먼저 Index 0으로 원소를 비교하고 그 다음으로 Index 1, Index2 ...Index N으로 진행한다. helper 클로저의 반환 값이 정렬 순서를 분리된 두 그룹으로 나뉘게 한 건 이 규칙 때문이다.