기본 콘텐츠로 건너뛰기

라벨이 중첩함수인 게시물 표시

[matplotlib]quiver()함수

[python] 클로저(Closure)

클로저(Closure) 다음 코드의 함수 first() 는 중첩함수 인 increse() 를 포함하는 외곽함수입니다. def first(x):     #(1) def increase(y):  #(3) return (x+y)   #(4) return increase(x) #(2) first(1) 2 위 코드에서 두 개의 변수 x 와 y 는 각각 비지역변수 그리고 지역변수가 됩니다. 이 함수의 동작과정은 다음과 같습니다. first 함수에 인수 x 값 전달 본문에서 중첩함수를 사용할 동인이 없으므로 바로 return() 함수를 실행 인수 x 에 1을 전달하면서 중첩함수 increase() 호출 중첩함수에 전달된 인수 x 는 지역변수 y값이 됩니다. 그러므로 x 와 y 모두 1이 됩니다. increase() 함수 실행으로 비지역변수( x )와 지역변수( y )의 합을 실행 사실 위 함수는 x 의 선언에 의해 y 가 결정되는 구조로 다음과 같이 간단히 작성할 수 있습니다. def first0(x): return (x+x) first0(1) 2 위와 같이 지역변수가 비지역변수에 의해 결정되는 구조에서는 중첩함수에 인수를 독립적으로 전달 또는 변경할 수 없습니다. 이것은 중첩함수의 인수가 외부함수 내부에서 선언되고 그 인수가 외부함수의 인수에 좌우되기 때문입니다. 대신에 비지역과 지역 변수가 외부함수의 호출과 함께 동시에 전달된다면 이 두 변수 값들은 독립적으로 사용될 수 있습니다. 그러나 함수 first()에 전달할 인수가 1개이므로 first()함수 구조로 중첩함수 increase() 내의 인수를 독립적으로 적용할 수 없습니다. 대신에 다음에 정의한 first1() 함수의 경우 중첩함수의 인수를 독립적으로 사용할 수 있습니다. def first1(x): def increase(y): return (x+y) return increase...

[python] 중첩함수(Nested function)와 비지역변수

중첩함수(Nested function)와 비지역변수 함수는 일급객체(First Class Object) 이므로 다음과 같이 사용되는 다른 함수에 인수로 전달 할 수 있습니다. def expNum(x, y): return(x**y) def addExp(func, x, y): return(func(x, y)+x+y) x, y= 2, 3 addExp(expNum, x, y) 13 위 코드의 addExp() 는 다른 함수를 인수로 사용하는 함수입니다. 다음 코드에서 작성한 함수 addExp1() 은 위에서 인수로 전달받는 함수를 함수 내부에 포함하는 방식으로 작성한 것으로 같은 결과를 나타냅니다. def addExp1(x, y): re=expNum(x, y) return(re+x+y) addExp1(x, y) 13 위 코드에서 함수 addExp1() 와 같이 함수 내부에 포함된 함수를 중첩함수(nested function) 라고 합니다. 변수는 선언되는 위치에 따라 전역변수(global variable)와 지역변수(local variable) 로 구분합니다. 이러한 구분은 각 변수의 작동영역이 제한되기 때문입니다. 중첩함수 내부에 선언된 변수는 그 내부에서만 작동합니다. 이 경우 이 변수가 지역변수가 되지만 그 외 부분에서 선언된 변수는 모두 전역변수가 될수는 없습니다. 이렇게 중접함수를 포함하는 계층적 구조를 가지는 함수의 경우 그림 1과 같이 구분합니다. 즉, 가장 내부에 포함된 함수의 변수는 지역변수가 되며 그 변수의 영역의 바깥 부분에 존재하는 변수는 비지역변수(nonlocal variable) 가 됩니다. 또한 블럭에 상관없이 모든 부분에서 사용가능한 변수를 전역변수라고 할 수 있습니다. 그러므로 비지역변수는 지역변수와 전역변수 사이에 위치하는 모든 변수를 통칭합니다. 그림 1. greeting() 함수에서 선언된 변수들의 범위. 다음 코드에서 함수 greeting() 는 중첩 함수인 ...