파이썬 - 데코레이터(2)

정태경·2022년 1월 15일
0

데코레이터 이해를 위한 First-class 함수
기존에 서술한 내용들과 중복될 수 있다

First-class 함수란

  • 다음과 같이 활용되는 함수를 Fisrt-class 함수 라고 부른다
    • 함수 자체를 변수에 저장 가능
    • 함수의 인자에 다른 함수를 전달 가능
    • 함수의 반환 값(return 값)으로 함수 전달 가능

파이썬과 First-class 함수

  • 파이썬은 모든 것이 객체로 되어있음. 함수, 클래스, 변수, 배열 등등
  • 따라서 함수 기능 이외에 객체처럼 활용이 가능함
    • 파이썬의 함수들은 모두 First-class 함수로 사용이 가능하다는 의미
💡 모든 언어가 First-class 함수를 지원하지는 않음. 함수형 프로그래밍에서부터 고안된 기법이며 대표적으로 최신 언어인 Python, Go, JavaScript, Kotlin 등이 지원함

First-class 함수 예제

def outer_func(num):
    # 중첩 함수에서 상위 함수의 변수에 접근 가능
    def inner_func():
        print(num)
        return 'complex'
    
    return inner_func

fn = outer_func(10)    # <--- First-class function
print(fn())            # <--- Closure 호출

First-class 함수 예제

  • 함수 자체를 변수에 저장 가능
def calc_square(digit):
	return digit * digit

a = calc_square

print(a)
""" 결과 : function calc_square at 0x7fc5080c4f70 
    즉, a 라는 변수에 함수가 할당되어 있는 것을 볼 수 있음. """

print(a(2))

""" 결과 : 4 
    a 에 할당된 calc_square 함수의 인자로 2가 전달되어 값은 4를 리턴함. """
  • 함수의 인자에 다른 함수를 전달 가능
def calc_square(digit):
    return digit * digit

def list_square(function, digit_list):
    result = []
    for digit in digit_list:
        result.append(function(digit))
    print (result)

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

list_square(calc_square, num_list)

""" 결과 : [1, 4, 9, 16, 25] 
		calc_square 함수가 list_square 함수의 인자로 전달되어 result 배열에 값 추가. """
  • 함수의 반환 값(return 값)으로 함수 전달 가능
def logger(msg):
    message = msg

    def msg_creator():    # <--- 함수 안에 함수를 만들 수도 있음
        print ('[HIGH LEVEL]: ', message)
    return msg_creator

log1 = logger('Dave Log-in')

print(log1)

""" 결과 : <function logger.<locals>.msg_creator at 0x7f85180889d0>
    log1 에는 리턴된 msg_creator 함수가 들어 있음.(즉, 함수 호출이 아니라 함수가 담겨 있음.)"""

log1()

""" 결과 : [HIGH LEVEL]:  Dave Log-in 
    msg_creator 함수가 호출되어 위와 같은 결과를 리턴함. """
profile
現 두나무 업비트 QA 엔지니어, 前 마이리얼트립 TQA 엔지니어

0개의 댓글