파이썬 중급 7일차

김영목·2021년 8월 8일
0

파이썬중급

목록 보기
13/18

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를 선언하면 참조가능상태가 된다. 
	
    
profile
안녕하세요 김영목입니다.

0개의 댓글