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

파이썬 클로저

파이썬 종료

이 튜토리얼에서는 Python 클로저, 클로저를 정의하는 방법 및 사용해야 하는 이유에 대해 알아봅니다.

중첩 함수의 비지역 변수

클로저가 무엇인지 알아보기 전에 먼저 중첩 함수와 비지역 변수가 무엇인지 이해해야 합니다.

다른 함수 안에 정의된 함수를 중첩 함수라고 합니다. 중첩된 함수는 둘러싸는 범위의 변수에 액세스할 수 있습니다.

Python에서 이러한 비-로컬 변수는 기본적으로 읽기 전용이며 수정하려면 명시적으로 비-로컬로 선언해야 합니다(nonlocal 키워드 사용).

다음은 비로컬 변수에 접근하는 중첩 함수의 예입니다.

def print_msg(msg):
    # This is the outer enclosing function

    def printer():
        # This is the nested function
        print(msg)

    printer()

# We execute the function
# Output: Hello
print_msg("Hello")

출력

Hello

중첩된 printer() 함수가 로컬이 아닌 msg에 액세스할 수 있었습니다. 둘러싸는 함수의 변수입니다.

<시간>

클로저 기능 정의

위의 예에서 print_msg() 함수의 마지막 줄이 printer()를 반환했습니다. 함수를 호출하는 대신? 이는 함수가 다음과 같이 정의되었음을 의미합니다.

def print_msg(msg):
    # This is the outer enclosing function

    def printer():
        # This is the nested function
        print(msg)

    return printer  # returns the nested function


# Now let's try calling this function.
# Output: Hello
another = print_msg("Hello")
another()

출력

Hello

이례적인 일입니다.

print_msg() "Hello" 문자열로 함수가 호출되었습니다. 반환된 함수는 another 이름에 바인딩되었습니다. . another() 호출 시 , 이미 print_msg() 실행을 완료했지만 메시지가 여전히 기억되었습니다. 기능.

이 기술은 일부 데이터("Hello 이 경우) 코드에 첨부되는 것을 Python에서는 클로저라고 합니다. .

변수가 범위를 벗어나거나 함수 자체가 현재 네임스페이스에서 제거되더라도 둘러싸는 범위의 이 값은 기억됩니다.

출력을 보려면 Python 셸에서 다음을 실행하십시오.

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

여기에서 반환된 함수는 원래 함수가 삭제된 경우에도 여전히 작동합니다.

<시간>

폐업은 언제인가요?

위의 예에서 볼 수 있듯이 중첩된 함수가 둘러싸는 범위의 값을 참조할 때 Python에서 클로저가 있습니다.

Python에서 클로저를 생성하기 위해 충족해야 하는 기준은 다음과 같이 요약됩니다.

<시간>

클로저를 언제 사용해야 하나요?

폐쇄가 좋은 이유는 무엇입니까?

클로저는 전역 값의 사용을 피할 수 있고 일종의 데이터 은닉을 제공합니다. 또한 문제에 대한 객체 지향 솔루션을 제공할 수도 있습니다.

클래스에서 구현할 메서드가 거의 없는 경우(대부분의 경우 하나의 메서드) 클로저는 대체적이고 보다 우아한 솔루션을 제공할 수 있습니다. 하지만 애트리뷰트와 메소드가 많아지면 클래스를 구현하는 것이 좋다.

다음은 클래스를 정의하고 객체를 만드는 것보다 클로저가 더 나을 수 있는 간단한 예입니다. 그러나 선호도는 전적으로 귀하의 몫입니다.

def make_multiplier_of(n):
    def multiplier(x):
        return x * n
    return multiplier


# Multiplier of 3
times3 = make_multiplier_of(3)

# Multiplier of 5
times5 = make_multiplier_of(5)

# Output: 27
print(times3(9))

# Output: 15
print(times5(3))

# Output: 30
print(times5(times3(2)))

출력

27
15
30

Python 데코레이터도 클로저를 광범위하게 사용합니다.

결론적으로, 클로저 함수로 묶인 값을 찾을 수 있다는 점을 지적하는 것이 좋습니다.

모든 함수 개체에는 __closure__가 있습니다. 클로저 함수인 경우 셀 개체의 튜플을 반환하는 속성입니다. 위의 예를 참조하면 times3times5 클로저 함수입니다.

>>> 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

  1. 파이썬 데이터 유형
  2. 파이썬 연산자
  3. 파이썬 통과 문
  4. Python 익명/람다 함수
  5. 파이썬 사전
  6. 파이썬 생성기
  7. 파이썬 데코레이터
  8. EXAMPLE이 있는 Python String strip() 함수
  9. 예제가 있는 Python Lambda 함수
  10. Python abs() 함수:절대값 예제