데코레이터를 이해하기전 알아야 할것들
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 |
댓글
이 글 공유하기
다른 글
-
python - default 인자 와 doc string 을 사용한 동적인 에러처리
python - default 인자 와 doc string 을 사용한 동적인 에러처리
2021.08.22 -
Decorator
Decorator
2020.12.07 -
벡터 클래스의 부활
벡터 클래스의 부활
2020.12.04 -
WeakValueDictionary 촌극
WeakValueDictionary 촌극
2020.12.04