클로저

매일 공부(ML)·2022년 6월 12일
0

이어드림

목록 보기
73/146

변수 영역과 클로저의 상호작용 방식을 이해하라

아래 코드의 동작 예상이 되는 이유

  • 파이썬 클로저: 자신이 정의된 영역 밖의 변수를 참조하는 함수로 도우미 함수가 sort_priority함수의 group인자 접근

    • 자신이 정의된 영역 외부에서 정의된 변수도 참조
    • 클로저 내부에 사용한 대입문은 클로저를 감싸는 영역에 영향을 끼침

  • 파이썬의 함수는 일급시민 객체

    • 변수를 직접적으로 가리킬 수 있게 되어서 대입 혹은 전달 가능

    • 식이나 if문에서 함수를 비교하거나 반환 가능

    • sort메서드는 클로저 함수를 key인자


  • 파이썬은 시퀀스를 비교하는 구체적인 규칙있다.

    • 원소를 순서대로 비교

    • 같다면 다음 원소로 넘어간다.

    • 원소 비교 혹은 결과가 정해질 때까지 계속

    • helper 클로저가 반환하는 튜플이 서로 다른 두 그룹 정렬


def sort_priority(values, group):
    def helper(x):
        if x in group:
            return (0,x)
        return (1,x)
    values.sort(key=helper)

numbers = [8,3,1,2,5,4,7,6]
group = {2,3,5,7}
sort_priority(numbers, group)
print(numbers) # [2,3,5,7,1,4,6,8]

영역 지정 버그 해결 방법

nonlocal코드 활용

  • global문을 보완
  • 간단한 함수에서만 활용

    • 활용으로 인해서 지정한 변수와 대입 이뤄지는 위치의 거리가 멀면 함수 동작을 이해하기 어렵다.
def sort_priority2(numbers, group):
    found = False
    def helper(x):
        nonlocal found
        if x in group:
            found = True
            return (0,x)
        return (1,x)
    numbers.sort(key=helper)
    return found

클래스와 함수이용

class Sorter:
    def __init__(self, group):
        self.group = group
        self.found = False
    

    def __call__(self,x):
        if xi in self.group:
            self.found = True
            return (0,x)
        return (1,x)

sorter = Sorter(group)
numbers.sort(key=sorter)
assert sorter.found is  True
profile
성장을 도울 아카이빙 블로그

0개의 댓글