Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬 클로저?

<시간/>

파이썬 클로저를 더 잘 이해하려면 먼저 중첩 함수와 파이썬 클래스가 무엇인지 이해해야 합니다. 요컨대, 파이썬 클로저는 데이터를 코드로 캡슐화하는 기능이기도 합니다.

Python 중첩 함수

다른 함수 안에 정의된 함수를 중첩 함수라고 합니다. 중첩된 함수는 둘러싸는 범위의 변수에 액세스할 수 있습니다.

def funcOut():
   print("This is outer function.")
   def funcIn():
      print("This function is defined inside funcOut. \nThis function(funcIn) is called\
nested function.")
   print("We can call nested function here.")
   funcIn()
print("We are in outer function.\nCalling funcOut.")
funcOut()

출력

We are in outer function.
Calling funcOut.
This is outer function.
We can call nested function here.
This function is defined inside funcOut.
This function(funcIn) is called nested function.

따라서 funcIn은 funcOut 내부에 정의된 중첩 함수입니다. 위의 출력을 보면 함수의 호출 순서를 이해할 수 있습니다.

funcOut에서 funcIn의 모든 기능을 갖고 싶은 경우 위 프로그램에서 "return funcIn"을 수행해야 할 수 있으므로 이것을 파이썬에서는 클로저라고 합니다.

간단히 말해서 클로저는 생성 환경(범위를 둘러싸는)을 기억하는 함수(객체)입니다.

def closureFunc(start):
   def incrementBy(inc):
      return start + inc
   return incrementBy
closure1 = closureFunc(9)
closure2 = closureFunc(90)
print ('clsure1(3) = %s' %(closure1(3)))
print ('closure2(3) = %s' %(closure2(3)))

출력

clsure1(3) = 12
closure2(3) = 93

closure1(3)으로 변수 closure1(함수 유형)을 호출하면 12가 반환되고 closure2(3)는 93이 반환됩니다. closure1과 closure2는 모두 동일한 함수 incrementBy를 참조하지만 두 개의 서로 다른 변수 closure1과 closure2가 있습니다. 식별자 closureFunc에 의해 함께 결합되어 다른 결과를 가져옵니다.

__closure__ attribute and cell objects

더 많은 정보를 얻으려면 __closure__ 속성과 셀 객체를 사용할 수 있습니다:

def closureFunc(start):
   def incrementBy(inc):
      return start + inc
   return incrementBy

a= closureFunc(9)
b = closureFunc(90)

print ('type(a)=%s' %(type(a)))
print ('a.__closure__=%s' %(a.__closure__))
print ('type(a.__closure__[0])=%s' %(type(a.__closure__[0])))
print ('a.__closure__[0].cell_contents=%s' %(a.__closure__[0].cell_contents))

print ('type(b)=%s' %(type(b)))
print ('b.__closure__=%s' %(b.__closure__))
print ('type(b.__closure__[0])=%s' %(type(b.__closure__[0])))
print ('b.__closure__[0].cell_contents=%s' %(b.__closure__[0].cell_contents))

출력

type(a) = <class 'function'>
a.__closure__ = <cell at 0x057F8490: int object at 0x68A65770>

type(a.__closure__[0]) = <class 'cell'>
a.__closure__[0].cell_contents = 9

type(b)=<class 'function'>
b.__closure__ = <cell at 0x0580BD50: int object at 0x68A65C80>

type(b.__closure__[0]) = <class 'cell'>
b.__closure__[0].cell_contents=90

위의 출력에서 ​​우리는 객체의 각 셀이 생성 당시의 값을 유지하는 것을 볼 수 있습니다.