goodthings4me.tistory.com
■ 파이썬 데코레이터 (Decorator)는 꾸며주는(덧붙여주는) 역할을 하는 함수 또는 클래스로써 클러저와의 차이점은 함수를 다른 함수의 인자로 전달한다는 점이다. 즉, 데코레이터 함수가 인자로 전달된 함수를 기능이 추가된 새로운 함수로 만들고 이 함수를 반환한다.
def smile():
print('^_^')
def confused():
print('@_@')
# 위 함수들의 결과를 'emoticon!'이라는 글이 위, 아래에 위치하도록 꾸며줄 수 있다.
def deco(func): # 데코레이터 함수
def wrap_func():
print('emoticon!')
func()
print('emoticon!')
return wrap_func
smile_deco = deco(smile)
smile_deco()
'''
emoticon!
^_^
emoticon!
'''
confused_deco = deco(confused)
confused_deco()
'''
emoticon!
@_@
emoticon!
'''
# 데코레이터 함수(deco)가 인자로 전달된 함수(smile, confused)에 기능을 추가
■ [전달 인자가 있는 함수 기반의 데코레이터]
def adder2(n1, n2):
return n1 + n2
def adder3(n1, n2, n3):
return n1 + n2 + n3
def adder_deco(func): # 데코레이터 함수
def wrap_func(*args): # 전달 인자를 튜플로 받는다.(튜플패킹)
print(*args, sep = ' + ', end = ' ') # 튜플언패킹
print('= {0}'.format(func(*args))) # 튜플언패킹
return wrap_func
adder2 = adder_deco(adder2)
# adder2 함수 객체를 인자로 넘기고, wrap_func 함수 객체 리턴
### 리턴된 함수 ###
#wrap_func(*args):
# print(*args, sep = ' + ', end = ' ')
# print('= {0}'.format(func(*args)))
adder2(3, 4) # 3 + 4 = 7
# wrap_func(3, 4)와 같고, 내부 코드가 실행됨
adder3 = adder_deco(adder3)
adder3(1, 2, 3) # 1 + 2 + 3 = 6
■ [전달 인자 2개 받는 경우의 데코레이터]
def deco_func(func):
def wrap_func(*args, **kwargs):
print('{} 함수 호출 직전'.format(func.__name__))
return func(*args, **kwargs) # func() 호출 실행 후 리턴
return wrap_func
def param_func(p1, p2):
print('내부 함수가 "{0}", "{1}" 매개변수를 받아 실행됨'.format(p1, p2))
param_f = deco_func(param_func)
param_f('토마토', 10)
# param_func 함수 호출 직전
# 내부 함수가 "토마토", "10" 매개변수를 받아 실행됨
■ [@ 기반으로 데코레이터 만들기]
def deco2(func):
def wrap_func():
print('emoticon!')
func()
print('emoticon!')
return wrap_func
#def smile2():
# print('^_^')
#smile_deco2 = deco2(smile2)
#smile_deco2()
# 위 주석 코드 대신에 아래처럼 @ 기호를 사용해도 동일한 결과임
@deco2
def smile2():
print('^_^')
smile2()
'''
emoticon!
^_^
emoticon!
'''
# 임의 숫자 여러 개 전달 시 더하기
def adders(func): # 데코레이터 함수
def wrap_func(*args):
print(*args, sep = ' + ', end = ' ')
print('= {0}'.format(func(*args)))
return wrap_func
@adders
def adders(*args):
return sum([n for n in args])
import random
n = random.sample(range(1, 100), random.randint(2, 10))
adders(*n) # 81 + 79 + 57 + 93 + 43 + 12 + 90 = 455
[참고 자료] 윤성우의 열혈파이썬 중급편
블로그 인기글
[국세청] 현금영수증가맹점으로 가입바랍니다. 메시지 해결방법(개인사업자)
▶ 현금영수증 가맹점 가입 메시지를 받고... 온라인 쇼핑몰 사업을 시작하려고 사업자등록증을 발급받고 난 후 얼마 안 있어서 국세청으로부터 어느 시점까지 '현금영수증 가맹점'으로 가입하라는 문자메시지가 받았었다. 그 메시지 기한이 오늘 도래했는데, 인터넷에서 찾아보니 홈택스에서 현금영수증 발급 사업자 신청을 할 수가 있었다. [관련내용] 홈>국세정책/제도>전자(세금)계산서/현금영수증/신용카드>현금영수증∙신용카드>가맹점가입 ▶ 홈택스 사이트에서 신청하는 절차는 다음과 같다. 우선, 홈택스에 로그인을 해야 합니다. 세상이 좋아져서 공인인증서 없이도 손쉽게 간편인증 로그인이 가능하다. 여러 인증방법 중 카카오톡 인증이 가장 편리한 거 같다. 간편인증 로그인 후 상단 '조회/발급' 탭 클릭 후 '현금영수증>현금..
goodthings4me.tistory.com
[엑셀] 근무연수 및 근무 개월수 계산하는 함수
직장을 다니다 보면 몇 년 몇 개월 또는 전체 며칠을 다니고 있는지 궁금할 때가 있다. 아니면, 총무나 인사 일을 할 때 직원들의 근속연수 또는 근속개월수 등을 계산하고 싶을 때도 있다. 이런 경우 엑셀 함수를 활용하면 어떨까!! 근무연수 및 근무 개월수 계산 함수 알아보기 엑셀에서 근무연수 또는 근무 개월수 계산하는 것은 datedif() 함수를 사용하면 간단하게 해결할 수 있다. 아래 이미지를 보면서 설명하면, 셀 E1에 기준일자를 입력하고, 근무연수를 구할 때는 =datedif(B3,$E$1,"Y")&"년" 을 입력한다. 근무개월수는 =datedif(B3,$E$1,"M")&"개월" 처럼 입력한다. 일수까지 파악할 때문 별로 없지만, 심심풀이로 구해보고 싶을 때 =datedif(B3,$E$1,"D")..
goodthings4me.tistory.com
Windows 10 탐색기 느려지는 증상과 해결하는 방법
잘 작동하던 Windows 10 탐색기가 갑자기 느려지는 증상이 발생했을 때 어떻게 조치를 하는지 구글에서 찾아보니 많은 해결책들이 있었으나 어떤 것이 정확한 해결책인지는 알 수가 없었다. 그래서 해결방법이라고 제시한 것들을 정리해 보았다. 윈도우 탐색기가 느려지는 증상 해결 방법 어느 순간부터 응용프로그램(VS Code 등)에서 폴더 열기나 파일 불러오기를 했을 때 검색 팝업창이 안 뜨거나 열리는 시간이 엄청 느려지는 증상과, 더불어서 탐색기도 실행이 많이 느려지는 증상이 있었다. 기존에 사용하던 VS Code에 openpyxl 설치 후 실행이 느려지는 증상이 발생하더니 윈도우10 탐색기도 느려져서 사용할 수가 없었다. 노트북에 OS(Windows10)를 설치한지 1년이 다 되어가긴 했지만, 1개월 전..
goodthings4me.tistory.com
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
[python] 파이썬의 진수 변환(2진수, 8진수, 10진수, 16진수) (0) | 2020.09.18 |
---|---|
[python] 파이썬 스태틱(static) 메서드와 클래스(class) 메서드 (0) | 2020.09.17 |
[python] 파이썬 중첩함수(Nested Function)와 클로저(Closure) (0) | 2020.09.15 |
[python] 파이썬 property객체, @property 데코레이터 (0) | 2020.09.14 |
[python] 파이썬 __slots__의 효과 (0) | 2020.09.14 |
댓글