아래 코드의 동작 예상이 되는 이유
파이썬 클로저: 자신이 정의된 영역 밖의 변수를 참조하는 함수로 도우미 함수가 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코드 활용
간단한 함수에서만 활용
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