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]
파이썬의 클로저 기능
클로저: 자신이 정의된 영역 밖의 변수를 참조하는 함수
파이썬에서 함수가 일급 시민 객체
일급 시민 객체: 변수에 대입하거나 다른 함수에 인자로 전달 등 제한이 없는 객체
파이썬에는 시퀸스(튜플 포함)를 비교하는 구체적인 규칙이 있음
우선순위가 높은 원소를 발견했을 때 플래그 설정하기
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]
파이썬 인터프리터가 변수 참조할 때 아래 순서로 영역을 뒤짐
현재 함수의 영역
현재 함수를 둘러싼 영역(현재 함수를 둘러싸고 있는 함수 등)
현재 코드가 들어 있는 모듈의 영역(global scope, 전역 영역)
내장영역(built-int scope)
ex. len, str 등의 함수가 들어 있는 영역
⇒ 참조하는 변수가 위 네가지 영역에 없으면 NameError 예외 발생