카테고리 없음

2024.03.19 6일차

동동순이 2024. 3. 19. 17:32
클로저

 

클로저(Closure)는 프로그래밍 언어에서 중요한 개념  하나로, 함수와  함수가 참조하는 외부 변수(또는 자유 변수) 사이의 관계를 나타냅니다. 클로저는 함수의 내부에서 정의된 함수로, 내부 함수가 외부 함수의 변수에 접근할  있고, 외부 함수는 내부 함수를 반환할  있습니다. 이로 인해 함수와  함수가 참조하는 상태(변수)를 함께 저장하고 유지할  있습니다.

 

def mul2(n):
  return n * 2
print(mul2(10))
print(mul2(5))
20
10

 

class Mul:
  def __init__(self, m):
    self.m = m
  def mul(self, n):
    return self.m * n
mul2 = Mul(2)
print(mul2.mul(10))
print(mul2.mul(5))
50
25
class Mul:
  def __init__(self, m):
    print('생성자 호출')
    self.m = m
  def __call__(self, n):
    print('call 호출')
    return self.m * n
mul2 = Mul(2)
print(mul2(10)) # 실핼 call 호출됨
print(mul2(5)) # 실행

 

생성자 호출
call 호출
20
call 호출
10
# 클로저 사용하기
def mul(m):
  def wrapper(n):
    return m * n
  return wrapper   # 클로저의 형태
'''
def wrapper(n):
    return 2 * n
'''
mul2 = mul(2)
print(mul2(10))
20

 

데코레이터

데코레이터(Decorator) 파이썬에서 함수나 메서드의 동작을 수정하거나 확장하기 위한 강력한 도구입니다. 데코레이터는 함수나 메서드를 래핑하거나 감싸서 추가 기능을 제공하며, 코드 재사용성과 가독성을 향상시킵니다. 데코레이터는 @ 기호를 사용하여 함수나 메서드 위에 적용됩니다.

import time

def func1(a, b):
    start = time.time()
    print('함수가 시작되었습니다')

    result = a + b

    end = time.time()
    print(f'함수 수행시간: {end - start}')

    return result

result = func1(10, 3)
print(result)
함수가 시작되었습니다
함수 수행시간: 7.462501525878906e-05
13

time.time() 지금 시간을 알아볼수 있다.

# 데코레이터 만들기
def func1(a, b):
  result = a + b
  return result

def func2(a, b):
  result = a * b
  return result
def elapsed(func):
  def wrapper(a, b):
    start = time.time()
    print('함수가 시작되었습니다')

    result = func(a, b)

    end = time.time()
    print(f'함수 수행시간은 {end - start}')
    return result
  return wrapper
deco1 = elapsed(func1)
result = deco1(10, 3)
print(result)
함수가 시작되었습니다
함수 수행시간은 7.796287536621094e-05
13
@elapsed
def func1(a, b):
  result = a + b
  return result

@elapsed
def func2(a, b):
  result = a + b
  return result

@elapsed
def func3(a, b):
  result = a - b
  return result
result = func1(10, 3)
print(result)
result = func2(10, 3)
print(result)
result = func3(10, 3)
print(result)
함수가 시작되었습니다
함수 수행시간은 0.0009424686431884766
13​
함수가 시작되었습니다
함수 수행시간은 0.0013077259063720703
13
함수가 시작되었습니다
함수 수행시간은 0.0008938312530517578
7