산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

Python 클로저 이해하기: 중첩 함수가 변수 캡처하는 방법

Python 클로저

Python 클로저 작동 원리, 정의 방법, 깔끔하고 효율적 코드에 필수인 이유 알아보기.

중첩 함수 내 비로컬 변수

클로저 탐구 전 중첩 함수와 비로컬 변수 이해 필수. 다른 함수 안에 정의된 함수를 중첩 함수라 함. 이런 함수는 외부 스코프 변수 읽기 가능.

Python에서 비로컬 변수는 기본적으로 읽기 전용. 수정하려면 중첩 함수 내에서 nonlocal로 명시적 선언 필요.

중첩 함수가 외부 스코프 변수 접근하는 간단 예제:

def print_msg(msg):
    # 외부 함수
    def printer():
        # 중첩 함수
        print(msg)
    printer()
print_msg("Hello")

출력

Hello

중첩 printer() 함수가 외부 스코프 msg 변수 접근.


클로저 함수 정의하기

외부 함수가 중첩 함수 호출 대신 반환하면? 코드는 이렇게:

def print_msg(msg):
    def printer():
        print(msg)
    return printer  # 중첩 함수 반환
# 반환된 함수 저장
another = print_msg("Hello")
another()

출력

Hello

print_msg 실행 완료 후에도 printer 함수가 msg 값 기억. 이 현상—함수가 정의 스코프 변수에 접근 유지—을 Python에서 클로저라 함.

원래 함수 삭제해도 반환된 함수 여전히 작동하는지 확인:

>>> del print_msg
>>> another()
Hello
>>> print_msg("Hello")
Traceback (most recent call last):
... NameError: name 'print_msg' is not defined

반환 함수가 클로저에 필요한 데이터 캡처했기에 계속 작동.


클로저가 생기는 조건

Python에서 클로저 존재 조건은 중첩 함수가:


클로저 활용 시기

클로저 여러 이점 제공:

흔한 예: 승수 함수 팩토리.

def make_multiplier_of(n):
    def multiplier(x):
        return x * n
    return multiplier
# 특정 승수 함수 생성
times3 = make_multiplier_of(3)
times5 = make_multiplier_of(5)
print(times3(9))  # 27
print(times5(3))  # 15
print(times5(times3(2)))  # 30

출력

27 15 30

Python 데코레이터 문법은 클로저에 크게 의존. 데코레이터 작성 시 래퍼 함수가 데코레이트 대상 함수 캡처해 클로저 형성.

클로저 검사엔 __closure__ 속성 사용. 캡처된 값 보유한 셀 객체 튜플 반환. 예:

>>> make_multiplier_of.__closure__
>>> times3.__closure__
(<cell at 0x0000000002D155B8: int object at 0x000000001E39B6E0>,)

각 셀의 cell_contents 속성에 클로저가 캡처한 실제 값:

>>> times3.__closure__[0].cell_contents
3
>>> times5.__closure__[0].cell_contents
5

클로저 이해로 불필요한 전역 변수 피하고 함수형 패러다임 포용하는 더 깔끔하고 모듈화된 Python 코드 작성 가능.


python

  1. 파이썬 데이터 타입 마스터하기: 실전 가이드
  2. 파이썬 연산자 마스터하기: 종합 가이드
  3. 파이썬 pass 문 마스터하기: 실전 가이드
  4. 파이썬 람다 함수: 익명 함수 실전 가이드
  5. Python 딕셔너리 마스터하기: 생성, 조작, 고급 기법
  6. Python 제너레이터: 효율적 이터레이션과 고급 활용
  7. Python 데코레이터 마스터하기: 전문 기법으로 함수 강화
  8. Python strip() 메서드 완전 정복: 종합 가이드와 실전 예제
  9. 파이썬 람다 함수 마스터하기: 실용 예제 & 모범 사례
  10. 파이썬 abs() 함수: 숫자 & 복소수의 절댓값 구하기