데이터과학 삼학년

First Class Function (일급 함수) 본문

Python

First Class Function (일급 함수)

Dan-k 2020. 4. 13. 17:32
반응형

파이썬 First class function에 대해 알아보자. python은 함수 자체를 변수로 할당할 수 있다.

함수 자체를 인자 (argument) 로써 다른 함수에 전달하거나 다른 함수의 결과값으로 리턴 할수도 있고, 함수를 변수에 할당하거나 데이터 구조안에 저장할 수 있는 함수이다.

결국 클로저를 활용할 수 있는 기반이 되는 개념이라고 보면 된다.

 

간단한 코드로 알아보자

# -*- coding: utf-8 -*-

def square(x):
    return x * x

print(square(5))

f = square

print(square)
print(f)
print(f(5))

========
<function square at 0x1018dfe60> ## 저장된 메모리 주소값
<function square at 0x1018dfe60>
25

함수 자체를 f라는 변수에 할당한 후 호출한 코드이다.

이렇게 함수를 변수로 할당하여 사용하면, 반복되는 코드에 조금 다른 코드를 적용하기 위해서 아래와 같이 간편하게 적용할 수 있다.

# -*- coding: utf-8 -*-
def square(x):
    return x * x

def cube(x):
    return x * x * x

def quad(x):
    return x * x * x * x

def my_map(func, arg_list):
    result = []
    for i in arg_list:
        result.append(func(i)) # square 함수 호출, func == square
    return result

num_list = [1, 2, 3, 4, 5]

squares = my_map(square, num_list)
cubes = my_map(cube, num_list)
quads = my_map(quad, num_list)

print(squares)
print(cubes)
print(quads)

===============
[1, 4, 9, 16, 25]
[1, 8, 27, 64, 125]
[1, 16, 81, 256, 625]

 

다른 예로 nested 함수를 정의하고, 이를 변수로 할당하여 처리하는 경우

유용하게 사용할 수 있는 예가 있다.

# -*- coding: utf-8 -*-
def logger(msg):
    
    def log_message(): #1
        print('Log: ', msg)
    
    return log_message

log_hi = logger('Hi')
print(log_hi) # log_message 오브젝트가 출력됩니다.
log_hi() # "Log: Hi"가 출력됩니다.

=======
<function log_message at 0x1029ca140>
Log:  Hi

여기서 log_message() 함수는 클로저(closure)라고 부른다. 클로저는 다른 함수의 지역변수를 그 함수가 종료된 이후에도 기억 할 수 있다.

# -*- coding: utf-8 -*-
def logger(msg):
    
    def log_message(): #1
        print('Log: ', msg)
    
    return log_message

log_hi = logger('Hi')
print(log_hi)  # log_message 오브젝트가 출력됩니다.
log_hi() # "Log: Hi"가 출력됩니다.

del logger # 글로벌 네임스페이스에서 logger 오브젝트를 지웁니다.

# logger 오브젝트가 지워진 것을 확인합니다.
try:
    print(logger)
except NameError:
    print('NameError: logger는 존재하지 않습니다.')

log_hi() # logger가 지워진 뒤에도 Log: Hi"가 출력됩니다.

======
<function log_message at 0x1007ca1b8>
Log:  Hi
logger는 존재하지 않습니다.
Log:  Hi

logger가 지워진 뒤에도 log_hi()를 실행하여 log_message가 호출된 것을 볼 수 있다.

logger 함수를 완전히 삭제한 이후에도 log_message 함수는 'Hi'를 기억하고 있는 것을 확인했다.

 

클로저를 좀 더 실용적으로 쓸 수 있는 예

# -*- coding: utf-8 -*-
# 단순한 일반 함수
def simple_html_tag(tag, msg):
    print('<{0}>{1}<{0}>'.format(tag, msg))
    
simple_html_tag('h1', '심플 헤딩 타이틀')

print '-'*30

# 함수를 리턴하는 함수
def html_tag(tag):
    
    def wrap_text(msg):
        print('<{0}>{1}<{0}>'.format(tag, msg))
        
    return wrap_text

print_h1 = html_tag('h1') #1
print(print_h1) #2
print_h1('첫 번째 헤딩 타이틀') #3
print_h1('두 번째 헤딩 타이틀') #4

print_p = html_tag('p')
print_p('이것은 패러그래프 입니다.')


============
<h1>심플 헤딩 타이틀<h1>
------------------------------
<function wrap_text at 0x1007dff50>
<h1>첫 번째 헤딩 타이틀<h1>
<h1>두 번째 헤딩 타이틀<h1>
<p>이것은 패러그래프 입니다.<p>

 

출처 : http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%8D%BC%EC%8A%A4%ED%8A%B8%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%95%A8%EC%88%98-first-class-function/
 

SchoolofWeb :: 파이썬 - 퍼스트클래스 함수 (First Class Function)

파이썬의 퍼스트클래스 함수 (First Class Function) 강좌.

schoolofweb.net

 

728x90
반응형
LIST
Comments