티스토리 뷰

Python 07, 08, 09 - Decorator, Module, Exception

- Decorator, Module, 예외처리


<First - Calss Function (일급함수) 조건 세가지>

  1. 파이썬의 함수는 변수에 저장 가능하다.
  2. 함수의 인자로 함수를 이용할 수 있다. => Decorator
  3. 함수의 결과값 (리턴값)으로 함수를 이용할 수 있다. => Closure

 

< Decorator>

  • 기존의 코드에 여러가지 기능을 추가하는 Python 구문

 

아래 두 코드는 실행 결과가 같다.

import time

def my_outer_func(func):    # my_func()의 기능 확정

    def my_inner_func():
        print("{} 함수 수행 시간을 계산합니다.".format(func.__name__))
        start = time.time()     # 1970년 1월1일 0시0분0초 0
        func()
        end = time.time()       # end - start = func() 함수 실행시간
        print("함수 수행 시간은 {}입니다.".format(start - end))

    return my_inner_func


def my_func():
    print("my_func() 함수가 호출되었어요!!")

decorated_my_func = my_outer_func(my_func)    # 함수의 주소값을 변수에 저장하여
decorated_my_func()    # 변수를 통해 주소값이 저장된 함수를 실행시킨다.


### 실행결과
# my_func 함수 수행 시간을 계산합니다.
# my_func() 함수가 호출되었어요!!
# 함수 수행 시간은 0.0입니다.
## Decorator 이용

import time

def my_outer_func(func):    # my_func()의 기능 확정

    def my_inner_func():
        print("{} 함수 수행 시간을 계산합니다.".format(func.__name__))
        start = time.time()     # 1970년 1월1일 0시0분0초 0
        func()
        end = time.time()       # end - start = func() 함수 실행시간
        print("함수 수행 시간은 {}입니다.".format(start - end))

    return my_inner_func

@my_outer_func
def my_func():
    print("my_func() 함수가 호출되었어요!!")

my_func()                    

## 실행결과
# my_func 함수 수행 시간을 계산합니다.
# my_func() 함수가 호출되었어요!!
# 함수 수행 시간은 0.0입니다.

 

 

  • Decorator 이용 시, 인자로 넘겨줄 인자의 종류나 갯수가 미지정된 경우

    • => args, kwargs 이용

def my_outer(func):
    
    def my_inner(*args, **kwargs):
        print("데코레이터!! 시작")
        func(*args, **kwargs)
        print("데코레이터!! 끝!!\n")

    return my_inner

@my_outer
def my_func():
    print("이것은 소리없는 아우성!!")
    
@my_outer
def my_add(x, y):
    print("두 수의 합은 : {}".format(X+y))
    
    
my_func()       # 데코레이터!! 시작
                # 이것은 소리없는 아우성!!
                # 데코레이터!! 끝!!

my_add(10, 20)  # 데코레이터!! 시작
                # 두 수의 합은 : 30
                # 데코레이터!! 끝!!    

 

  • 본래 args, kwargs 이용

    • 1.) argstuple로 받는다.

    • 2. ) kwargsdict로 받는다.

# 인자로 들어온 사람의 이름을 출력하는 코드

# 1. *args는 tuple로 받는다.
def print_user_name1(*args):
    for name in args:
        print(name)
        
print_user_name("홍길동", "신사임당")  # 이렇게도 가능
print_user_name("홍길동", "신사임당", "유관순")  # 이렇게도 가능


# 2. **kwargs는 dict로 받는다.
def print_user_name2(**kwargs):
    for key in kwargs.keys():
        print(kwargs.get(key))
        
print_user_name(name1="홍길동", name2="신사임당")
# 홍길동
# 신사임당      

 

 

<Module>

  • python에서 Module은 함수나 변수 또는 클래스를 모아놓은 파일을 지칭

  • 다른 python 파일에서 불러와서 사용할 수 있다.

  • module 사용 목적은 1) 코드 재사용성 2) 관리 목적

  • module의 종류는 크게 두가지가 있다.

    • 1) C언어로 구성된 binary module
    • 2) python언어로 구현된 일반 module
  • import하여 사용한다.

  • module도 파이썬 입장에서는 객체로 관리된다.

 

 

modele 파일 작성 후 경로 추가

import sys

print(sys.path)     # python system library 폴더들 list
sys.path.append("c:/python_data")    # module을 저장할 폴더를 지정
print(sys.path)

# # module1.py 파일을 "c:/python_data"에 저장한다.

 

작성한 모듈 사용하기

## 작성한 모듈 다시 사용하기
# import module1
# import module1 as m1
# from module1 (패키지명) import my_adder
# from module1 import *
### c:/python_data/test_module/module1.py 새 폴더 안에 모듈 파일 저장
#  => import test_module.module1
####

import module1

print(module1.my_pi)                # 3.1414926535
print(module1.my_adder(10, 20))     # 30

import module1 as m1
print(m1.my_pi)                # 3.1414926535
print(m1.my_adder(10, 20))     # 30

from 패키지명
from module1 import my_adder
print(my_adder(10, 20))     # 30

from module1 import *
print(my_pi)                # 3.1414926535

# c:/python_data 안에 module1.py를 저장해 놓았다.
# c:/python_data/test_module/module1.py로 다시 저장하자.

import test_module.module1

print(test_module.module1.my_pi)    # 3.1414926535

import test_module.module1 as my_module

print(my_module.my_pi)              # 3.1414926535j

 

 

<Exception>

  1. compile time error - 문법 오류
  2. run time error - 실행 시 발생하는 오류
    • 어떤 runtime error들은 비정상 종료되지 않고 프로그램을 지속적으로 수행시킬 수 있는 방법이 있다.
    • => 예외처리 (exception)
  • 예외 처리 구문:try/ exception/ else/ finally
def my_func(my_list):

    total_sum = 0   # list 안의 숫자들을 누적한다.

    try:
        total_sum = my_list[0] + my_list[1] + my_list[2]
        print("try가 수행되었어요!!")

    except Exception:
        print("오류가 존재합니다.")     # 예외처리를 해야 한다!

    else:
        print("오류가 없어요!!")

    finally:
        print("무조건 수행되요!!")

my_func([1, 2, 3])
# try가 수행되었어요!!
# 오류가 없어요!!
# 무조건 수행되요!!

my_func([1, 2])
# 오류가 존재합니다.
# 무조건 수행되요!!
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함