Python/Tutorial

[Python] 함수(4) - Decorlator, 사용예제

뒷골목프로그래머 2020. 4. 3. 12:28
반응형

본 포스팅은 패스트 캠퍼스의  [온라인] 데이터 사이언스 스쿨을 수강하며 학습한 내용을 정리한 것입니다.

 

데이터 사이언스 스쿨 온라인

대학교재보다 상세한 강의자료, 현직 실무자의 노하우까지 모두 얻어가세요 ! 이미 수많은 비전공자들이 데이터 사이언티스트로 커리어 전환에 성공한 바로 그 강의. 데이터 사이언스 스쿨 오프라인 정규 과정을 이제는 온라인에서 만나보세요!

www.fastcampus.co.kr


 

 Decorlator는 함수에서 코드를 바꾸지 않고 기능을 추가하거나 수정하고 싶을 때 사용하는 문법이다.

아래 코드블럭을 살펴보면, 선언된 함수 a와 b에 code_1과 code_3이 반복되는 것을 알 수 있다. 따라서 함수 c를 선언해 중복되는 code_1과 code_3을 사용할 수 있게끔 하고 중복되지 않는 code_2와 code_5는 wrapper의 result로 받는다. 함수 a와 b를 선언하게 되면, 결과적으로 wrapper로 치환되는 것이다.

 사용방법은 데코레이터 함수를 선언하고(아래 코드블럭 c 참조) 사용하고자하는 함수 위에 @데코레이터함수명 을 쓰면된다.

def a():
  code_1
  code_2
  code_3
def b():
  code_1
  code_5
  code_3
  
def c(func):
    def wrapper(*args, **kwargs):
        code_1
        result = func(*args, **kwargs)
        code_3
        return result

    return wrapper

@c
def a():
    code_2

@c
def b():
    code_4

 

활용예제 : 함수의 실행시간을 출력하는 데코레이터 함수 작성

 

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time() # code_1
        result = func(*args, **kwargs) # code2, code4
        end_time = time.time() # code_3
        print("running time : {}".format(start_time-end_time)) # code3
        return result
    return wrapper
    
@timer
def test1(num1, num2):
    data = range(num1, num2+1)
    return sum(data)
    
@timer
def test2(num1, num2):
    result = 0
    for num in range(num1, num2+1):
        result += num
    return result
    
test1(1, 100000) # 실행결과 : running time : -0.0019974708557128906
test2(1, 100000) # 실행결과 : running time : -0.004986286163330078

 

# 활용예제 2 : ID와 PASSWORD를 확인하여 일치하는 경우에만 함수를 실행하는 decorlator함수 작성

 

1. 개인의 정보는 id, pwd, addr 3가지를 묶어 dict형식이며 개인의 정보를 묶어 list형태로 저장함

   datas = [{"id":"Kobe", "pwd":"Bryant", "addr":"LA"}, ... ]

 

2. Logic

  • id와 password를 먼저 입력받는다.
  • 입력받은 id와 password를 비교하기 위해 for문을 활용한다.
  • for data in datas: 형태로 for문을 선언한다.
  • data["id"] == 입력받은 ID and data["pwd"] == 입력받은 Password 일 때 함수를 실행한다.
  • 실제코드는 아래 Github 링크 참조

 

 

Seuleeee/python_algorithm

Contribute to Seuleeee/python_algorithm development by creating an account on GitHub.

github.com

 

반응형