1교시 : closure의 사용과 비교(with class)
우선, class를 이용해서 어떤 모듈을 만들어보자.
class divide() :
def __init__(self) :
self._series = []
def __call__(self, *numbers) :
self._series.append(numbers)
print(f'my_list is {self.series}')
return sum(self.series) / len(self.series)
# 인스턴스화 시킴
my_divide = divide()
print(my_divide(20))
= my_list is [20] / 20
print(my_divide(30))
= my_list is [20,30] / 25
이것을 다른 방식으로 표현한 것이 closure이다.
def my_avg() :
my_list = []
def my_try (*numbers) :
my_list.append(*numbers)
print(my_list, sum(my_list) / len(my_list))
return my_try
closure의 사용은 일반함수의 정의와 유사한데 ,
마지막에 return부분에서 실제 인자를 받아 사용되는 아래 함수의 이름을 한번 넣어줘야한다.
많은 closure의 사용이 있지만 대표적으로 잘못 사용되어 에러가 발생되는 경우를 살펴보자.
def error_try() :
x = 200
def error_making(*args) :
x += args
return x
return error_making
이렇게 하고 a = error_try()
print(a(200))을 하면 어떻게 될까??? 이렇게 하면 메소드 error_making에서 참조할 x가 없어서 에러가 발생한다.
그래서 이렇때 사용하는 것이 nonlocal 변수 이다.
그래서
def error_try() :
x = 200
def error_making(*args) :
nonlocal x
x += args
return x
return error_making
위와 같은 방식으로 x를 선언하면 참조가능상태가 된다.