def square(x):
return x*x
f=square
print f(5)
위 코드를 보면 함수 square 를 정의하고 호출하였다. f(5) 구문으로 square함수를 호출한 것을 볼 수 있다. 위에서 언급했듯이 프로그래밍 언어가 퍼스트클래스 함수를 지원하면 변수에 함수를 할당할수있고 인자로써 다른 함수에 전달하거나 함수의 리턴값으로도 사용할 수 있다.
다른 예제,
def logger(msg):
def log_message():
print 'Log:', msg
return log_message
log_hi = logger('Hi')
print log_hi
log_hi()
log_message 라는 함수를 logger함수의 리턴값으로 리턴하여 log_hi라는 변수에 할당한 후 호출한 것을 볼 수 있다. 그런데 여기서 특이한 점을 볼 수 있는데, msg와 같은 함수의 지역변수 값은 함수가 종료된 이후에도 참조됐다는 것. 이런log_message와 같은 함수를 클로져라고 하며 클러져는 다른 함수의 지역변수를 그 함수가 종료된 이후에도 기억할 수 있다.
def logger(msg):
def log_message():
print 'Log:', msg
return log_message
log_hi = logger('Hi')
print log_hi
log_hi()
del logger #글로벌 네임스페이스에서 logger오브젝트 지운다.
try:
print logger
except NameError:
print 'NameError: logger는 존재하지 않습니다.'
log_hi() #logger가 지워진 뒤에도 Log:Hi 가 출력된다.