다음과 같이 다룰 수 있는 함수를 first-class 함수라 부름
- 함수 자체를 변수에 저장 가능
- 함수의 인자에 다른 함수를 인수로 전달 가능, func1(func2)
- 함수의 반환 값으로 함수를 전달 가능
- 삭제해도 그전에 저장해 놓았으면 함수의 기능은 살아있다 변수에서만
- 내장 함수 부를때 () 써야 함수가 실행되는거임
def list_creator(tag):
def text_wrapper(msg):
for i in msg:
print ('{0} {1}'.format(tag,i))
return text_wrapper
data_list = list_creator('-')
data_list(['안녕','하세요']) # 그 안에 있는 함수에 넣을 때에는 또 변수를 넣어서 사용해야한다.
def list_creator2(tag):
def text_wrapper(list_msg):
for msg in list_msg:
print('{} {}'.format(tag, msg))
return text_wrapper
data_list2 = list_creator2('+')
data_list2(['바보','멍청이'])
함수에 있는 데이터를 함께 복사, 저장해서 별도 함수로 활용하는 기법
외부 함수가 소멸되더라도, 외부 함수안에 있는 로컬 변수 값과 중첩함수를 사용할 수 있는 기법
def outer_func(num):
def inner_func():
print(num)
return '안녕'
return inner_func
clousre_func = outer_func(10)
clousre_func()
del outer_func
print(clousre_func())
a=clousre_func()
데코레이터 -> 함수 순으로 출력, 데코레이터 함수 안에서 함수가 실행되는 것
def datetime_decorator(func): # 데코레이터 특징임 함수위에 붙이는거니까 그함수가 들어갔을때 자동으로 그함수가 들어감
def wrapper():
print('time' + str(datetime.datetime.now()))
func()
print(datetime.datetime.now())
return wrapper
# 데코레이터로 감싼 함수가 제일 먼저 실행 된다 생각하고 안에 안에 가 함수가 실행되는 개념임
@datetime_decorator
def logger_login():
print("hak")
logger_login()
def type_checker(function) :
def inner_func(digit1,digit2):
if (type(digit1) != int) or (type(digit2) != int):
return 'only integer support'
return function(digit1,digit2)
return inner_func
@type_checker
def muliplexer(digit1, digit2):
return print(digit1 * digit2)
muliplexer(11,2) # 반환 되지않음
def general_decorator(func):
def wrapper(*args, **kwargs):
print('function is decorated')
return func(*args, **kwargs)
return wrapper
@general_decorator
def calc_quad(digit1, digit2, digit3, digit4):
return digit1 * digit2 * digit3 * digit4
calc_quad(2,3,4,5)
def decorator1(func):
def wrapper():
print('decorator1')
func()
return wrapper
def decorator2(func):
def wrapper():
print('decorator2')
func()
return wrapper
@decorator1
@decorator2
def hello():
print('hello')
hello()
# decorator1
# decorator2
# hello
사용할 데코레이터에 self 를 넣어줘야함
def h1_tag(function):
def wrapper(self, *args, **kwargs):
return "<h1>{}</h1>".format(function(self, *args, **kwargs)) # 함수에도 self 넣어야함
return wrapper
class Person:
def __init__(self, first, last):
self.first = first
self.last = last
@h1_tag
def get_name(self):
return self.first + ' ' + self.last
hak = Person('kim','byunghak')
print(hak.get_name())
def decorator(num):
def outer_wrapper(function):
def innter_wrapper(*args, **kwargs):
print('decorator1 {}'.format(num))
return function(*args, **kwargs)
return innter_wrapper
return outer_wrapper
def print_hello():
print('hello')
print_hello2 = decorator(1)(print_hello)
print_hello2()
@decorator(1)
def print_hello():
print('hello')
print_hello()
# decorator1 1
# hello
# 예제 2
def mark_html(tag):
def outer_wrapper(function):
def innter_wrapper(*args, **kwargs):
return '<' + tag + '>' + function(*args, **kwargs) + '</' + tag + '>'
return innter_wrapper
return outer_wrapper
@mark_html('h')
def print_title(title):
return title
print(print_title('hak'))
<h>hak</h>
# 예제 3
def type_checker(func):
def wrapper(digit1,digit2):
if type(digit1) == int and type(digit2) == int:
return func(digit1,digit2)
else:
return 'only ineger support'
return wrapper
@type_checker
def mul(digit1,digit2):
return print(digit1 * digit2)
mul(1,4)
# 예제 4
def tag(tag):
def mark(function):
def wrapper(*args,**kwargs):
return f'<{tag}>{function(*args,**kwargs)}</{tag}>'
return wrapper
return mark
@tag('b')
def add_html(string):
return string
print(add_html('하이'))