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__
가 있습니다. 클로저 함수인 경우 셀 개체의 튜플을 반환하는 속성입니다. 위의 예를 참조하면 times3
및 times5
클로저 함수입니다.
>>> 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에서 문자열을 생성, 형식 지정, 수정 및 삭제하는 방법을 배웁니다. 또한 다양한 문자열 연산과 기능을 소개합니다. 동영상:Python 문자열 파이썬에서 문자열이란 무엇입니까? 문자열은 일련의 문자입니다. 문자는 단순히 상징입니다. 예를 들어 영어는 26자입니다. 컴퓨터는 문자를 다루지 않고 숫자(2진수)를 처리합니다. 화면에 문자가 보이더라도 내부적으로는 0과 1의 조합으로 저장되고 조작됩니다. 이 문자를 숫자로 변환하는 것을 인코딩이라고 하고 그 반대의 과정을 디코딩이라고 합니
파이썬 주요 기능이란 무엇입니까? Python 주요 기능 모든 프로그램의 시작점입니다. 프로그램이 실행되면 파이썬 인터프리터가 코드를 순차적으로 실행합니다. Main 함수는 Python 프로그램으로 실행될 때만 실행됩니다. 모듈로 가져온 경우 메인 기능을 실행하지 않습니다. 파이썬에서 def main() 함수는 무엇입니까? 이를 이해하려면 다음 예제 코드를 고려하십시오. def main() 예제 1 def main(): print (Hello World!) print (Guru99) 여기에서 두 개의 인쇄가