728x90

first_class 함수

 

  • 다음과 같이 다룰 수 있는 함수를 first_class 함수라고 부름
  • 함수 자체를 변수에 저장가능
  • 함수의 인자에 다른 함수를 인수로 전달 가능
  • 함수의 반환 값(return 값)으로 함수를 전달 가능
  • 파이썬과 First_class 함수
  • 사실 파이썬에서는 모든 것이 객체!
  • 파이썬 함수도 객체로 되어 있어서, 기본 함수 기능 이외 객체 와 같은 활용이 가능
  • 즉 파이썬의 함수들은 First-class 함수로 사용가능
  • 언어별 일급함수 지원여부
  • python, Go, javascript, Kotlin 은 일급함수 지원 c언어 등은 미지원

 

def calc_square(digit):
    return digit * digit


print(calc_square(2))


def list_square(func, digit_list):
    result = tuple()
    for digit in digit_list:
        result += func(digit),

    return result


num_list = [1, 2, 3, 4, 5]
res = list_square(calc_square, num_list)
print(res)

 

 

"""함수의 결과값으로 함수를 리턴할 수도 있음"""
def logger(msg):
    message = msg
    def msg_creator():
        print('[HIGH LEVEL]: ', message)
    return msg_creator()

log1 = logger('jongyun Log-in')
print(id(log1))
print(id(logger('jongyun Log-in')))

"""First_class 함수 활용"""
def html_creator(tag):
    def text_wrapper(msg):
        print('<{0}>{1}</{0}>'.format(tag, msg))
    return text_wrapper

h1_html_creator = html_creator('h1')
h1_html_creator('H1 태그는 타이틀을 표시하는 태그입니다.')

p_html_creator = html_creator('p')
p_html_creator('p 태그는 문단을 표시하는 태그입니다.')

 

 

"""연습"""
def mark_down(symbol):
    def wrapper(items: list):
        for item in items:
            print("%s %s" % (symbol, item))
    return wrapper

my_list = ["apple", "banana", "cat"]
barsymbol = mark_down('-')
barsymbol(my_list)

 

 

Closure_function

 

  • 함수와 해당 함수가 가지고 있는 데이터를 함께 복사, 저장해서 별도 함수로 활용하는 기법으로 First_class 함수와 동일
  • 외부 함수가 소멸되더라도, 외부 함수안에 있는 로컬 변수 값과 중첩함수(내부함수)를 사용할 수 있는 기법
  • * 지금까지 배운 언어의 맥락과는 뿌리가 다른사고 - functional programing 에서 고안된 기법
  • 그래서 처음에 접하면 매우 이해하기 힘들 수 있다.

 

def outer_func(num):
    # 중첩 함수에서 외부 함수의 변수에 접근 가능
    def inner_func():
        print(num)
        return '안녕'
    return inner_func


closure_func = outer_func(10)
print(closure_func())

del outer_func

print(closure_func())
# print(outer_func()) 요기서는 함수를 찾을수 없어 error 발생

 

 

위의 예제에서 closure_func 이 바로 closure 임


closure_func = outer_func(10) 에서 outer_func 함수는 호출종료


outer_func(10) 호출 종료시 num 값은 없어졌으나, closure_func()에서 inner_func 이 호출되면서 이전의 num 값(10)을 사용함


심지어 outer_func 함수를 아예 삭제시켜버려도 inner_func()와 num 값(10)은 살아있음

 

언제 closure 를 사용할까?

 

  • closure 는 객체와 유사
  • 일반적으로 제공해야할 기능(method)이 적은 경우, closure 를 사용하기도함
  • 제공해야할 기능이 많은 경우 class 를 구현
728x90

'Python > python - pythonic' 카테고리의 다른 글

python - default 인자 와 doc string 을 사용한 동적인 에러처리  (0) 2021.08.22
Decorator  (0) 2020.12.07
벡터 클래스의 부활  (0) 2020.12.04
WeakValueDictionary 촌극  (0) 2020.12.04
약한참조  (2) 2020.12.02