-
Python 문법 기초 18 - 클로저(closure)Python 2022. 10. 22. 16:28
클로저(closure) : scope에 제약을 받지않는 변수를 포함하고 있는 코드 블록이다.
내부함수의 주소를 반환함으로 해서 함수 내의 지역변수를 함수 밖에서 참조 가능
def funcTimes(a, b): c = a * b return c print(funcTimes(2, 3)) kbs = funcTimes(2, 3) print(kbs) kbs = funcTimes print(kbs) print(kbs(2, 3)) print(id(kbs), id(funcTimes)) del funcTimes # 함수 삭제 # funcTimes() # 함수가 삭제되었음으로 에러 발생 print(kbs(2,3)) # 주소, 값은 같지만 새로운 함수이므로 삭제되지 않음 mbc = sbs = kbs print(mbc(2,3)) <console> 6 6 <function funcTimes at 0x0000016EFE49ACA0> 6 1576224271520 1576224271520 6 6클로저를 사용하지 않은 경우
print('클로저를 사용하지 않는 경우') count = 0 def out(): count = 0 def inn(): nonlocal count # count의 값을 out으로 하기 위해서 사용! count += 1 return count # inn() # 같은 방식 imsi = inn() # 같은 방식 return imsi # 같은 방식 # print(out()) err print(out()) print(out()) <console> 1 1지역변수와 전역변수를 잘 이해해야 된다.
클로저를 사용한 경우
print('\n클로저를 사용한 경우') count = 0 def outer(): count = 0 def inner(): nonlocal count # count의 값을 out으로 하기 위해서 사용! count += 1 return count return inner # <=== 이것이 클로저 : 내부함수의 주소를 반환 var1 = outer() # inner 의 주소를 리턴받음 print(var1) print(var1()) print(var1()) print(var1()) print(var1()) <console> <function outer.<locals>.inner at 0x000002C1D25761F0> 1 2 3 4내부함수의 주소를 반환함으로 해서 함수 내의 지역변수를 함수 밖에서 참조 가능하다.
print('*** 수량 * 단가 * 세금을 계산하는 함수 만들기') # 분기별로 세금은 동적이다. def outer2(tax): # local 변수. def inner2(su, dan): amount = su * dan * tax return amount return inner2 # 1분기에는 tax가 0.1 부과 q1 = outer2(0.1) # inner2의 주소가 반환 됨. result1 = q1(5, 50000) print('result1 : ', result1) result2 = q1(1, 10000) print('result2 : ', result2) # 2분기에는 tax가 0.05 부과 q1 = outer2(0.05) # inner2의 주소가 반환 됨. result3 = q1(5, 50000) print('result3 : ', result3) result4 = q1(1, 10000) print('result4 : ', result4) <console> *** 수량 * 단가 * 세금을 계산하는 함수 만들기 result1 : 25000.0 result2 : 1000.0 result3 : 12500.0 result4 : 500.0세금을 구하기 위해 수량, 단가, 세금을 구하는 함수의 주소를 리턴받아서 실행시켜준다.
'Python' 카테고리의 다른 글
Python 문법 기초 20 - 함수 장식자(decorator) (0) 2022.10.22 Python 문법 기초 19 - 일급함수와 람다함수 (0) 2022.10.22 Python 문법 기초 17 - argument(인자) 와 parameter(매개변수) (0) 2022.10.22 Python 문법 기초 16 - 변수의 접근 순서 (0) 2022.10.22 Python 문법 기초 15 - random 함수 (0) 2022.10.22