def sort_priority(values, group):
    def helper(x):
        print(x)
        if x in group:
            print(0, x)
            return (0, x) # group에 있는 수들
        print(1, 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)

>>
8
1 8
3
0 3
1
1 1
2
0 2
5
0 5
4
1 4
7
0 7
6
1 6
[2, 3, 5, 7, 1, 4, 6, 8]

위 함수가 작동되는 3가지 이유

  1. 파이썬의 클로저 기능

    클로저: 자신이 정의된 영역 밖의 변수를 참조하는 함수

  2. 파이썬에서 함수가 일급 시민 객체

    일급 시민 객체: 변수에 대입하거나 다른 함수에 인자로 전달 등 제한이 없는 객체

  3. 파이썬에는 시퀸스(튜플 포함)를 비교하는 구체적인 규칙이 있음

우선순위가 높은 원소 발견 표시하기

1. 플래그 설정

우선순위가 높은 원소를 발견했을 때 플래그 설정하기

def sort_priority2(values, group):
    flag = False
    def helper(x):
        if x in group:
            flag = True # helper 영역에서 새롭게 정의된 변수
            return (0, x) 
        return (1, x)
    values.sort(key=helper)
    return flag

numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}
flag = sort_priority2(numbers, group)
print('발견: ', flag)
print(numbers)

>>
발견:  False
[2, 3, 5, 7, 1, 4, 6, 8]

파이썬 인터프리터가 변수 참조할 때 아래 순서로 영역을 뒤짐

  1. 현재 함수의 영역

  2. 현재 함수를 둘러싼 영역(현재 함수를 둘러싸고 있는 함수 등)

  3. 현재 코드가 들어 있는 모듈의 영역(global scope, 전역 영역)

  4. 내장영역(built-int scope)

    ex. len, str 등의 함수가 들어 있는 영역

⇒ 참조하는 변수가 위 네가지 영역에 없으면 NameError 예외 발생