AI/Python
[python] 클로저와 nonlocal, 데코레이터(@)
brave_sol
2024. 12. 2. 19:10
1. 클로저란?
- 함수 안에 있는 변수를 기억하고 계속 사용하고 싶을때 사용(상태 저장)
- 함수안에 변수와 또 다른 함수를 만들어서 사용한다
- 바깥 함수의 변수는 안쪽 함수에서만 사용할 수 있어 외부에서 함부로 변경할 수 없다
- 코드를 깔끔하게 적을 수 있고, 중요한 데이터나 계산을 숨길 수 있어 안전하다.
- 데이터를 저장하거나 버튼 클릭수를 세는데 사용
def outer(m):
def inner(n):
return m*n
return inner
outer3 = outer(3) # inner가 3을 저장함
outer3(4) # 12
outer3(5) # 15
outer3(6) # 18
- nonlocal : 바깥 변수를 수정할때 사용
def button():
i = 0
def count():
nonlocal i
i += 1
return i
return count
button_counter = button()
button_counter() # 1
button_counter() # 2
button_counter() # 3
2. 클래스를 사용하면 되지 않나?
- 클로저의 경우 더 짧고 간결하며, 캡슐화가 더 강력하다.
특징 | 클로저 | 클래스 |
코드의 간결 | 간단한 작업에 적합(짧고 간결) | 더 많은 기능을 추가하기에 적합 |
상태 저장 | 함수 안의 변수를 기억하고 저장 | 인스턴스 변수로 상태 저장 |
재사용성 | 특정한 역할에 집중(필요한 함수만 반환) | 여러 메서드와 속성을 가진 복잡한 객체 생성 가능 |
캡슐화(숨기기) | 변수는 함수 안에 숨겨져 외부에서 완전 접근 불가 | __를 사용해 이름을 변경하는 식으로 숨김 |
3. 데코레이터란?
- 함수에 다른 기능을 추가하는 것
- 기존 함수의 호출 방식을 바꾸지 않아도 기능을 확장할 수 있다.
- 함수마다 중복 코드가 발생할 필요가 없어 부가 기능과 본래 기능을 분리하고 각자의 역할이 명확해진다.
- @기호로 간단하게 추가하여 코드가 간결해지고, 가독성과 유지보수성이 좋아진다.
import time
def 실행_시간_측정(func):
def wrapper(*args, **kwargs):
시작 = time.time()
결과 = func(*args, **kwargs)
끝 = time.time()
print(f"{func.__name__} 실행 시간: {끝 - 시작:.4f}초")
return 결과
return wrapper
@실행_시간_측정
def 계산():
time.sleep(1)
print("계산 완료!")
계산()
# 계산 완료!
# 계산 실행 시간: 1.0000초
반응형