이 글은 주로 Python 기본 튜토리얼에서 클로저 사용 방법에 대한 정보를 소개합니다. 도움이 필요한 친구들은
Python 기본 튜토리얼의 클로저 사용 방법
을 참조하세요. 머리말:
클로저는 함수형 프로그래밍에서 중요한 문법 구조입니다. 함수형 프로그래밍은 프로그래밍 패러다임입니다. 절차적 프로그래밍과 객체 지향 프로그래밍도 프로그래밍 패러다임입니다. 프로세스 지향 프로그래밍에서는 함수를 보았고, 객체 지향 프로그래밍에서는 객체를 보았습니다. 함수와 객체의 기본 목적은 코드를 특정 논리적 방식으로 구성하고 코드의 재사용성을 향상시키는 것입니다. 클로저는 코드를 정리하는 구조이기도 하며 코드의 재사용성을 향상시킵니다.
다양한 언어는 다양한 방식으로 클로저를 구현합니다. Python은 함수 개체를 기반으로 하며 클로저의 구문 구조에 대한 지원을 제공합니다(우리는 Python이 개체를 사용하여 특수 메서드 및 다중 패러다임에서 일부 특수 구문을 구현하는 것을 여러 번 보았습니다). 파이썬에서는 모든 것이 객체이고, 함수의 문법적 구조도 객체입니다. 함수 객체에서는 함수 객체의 이름을 바꾸거나 함수 객체를 매개변수로 전달하는 등 일반 객체처럼 함수 객체를 사용합니다.
함수 개체의 범위
다른 개체와 마찬가지로 함수 개체에도 고유한 생존 범위가 있는데, 이것이 함수 개체의 범위입니다. 함수 객체는 def 문을 사용하여 정의되며, 함수 객체의 범위는 def가 위치한 수준과 동일합니다. 예를 들어, 다음 코드에서 line_conf 함수의 소속 범위 내에서 정의한 함수 라인은 line_conf의 소속 범위 내에서만 호출될 수 있습니다.
def line_conf(): def line(x): return 2*x+1 print(line(5)) # within the scope line_conf() print(line(5)) # out of the scope
line 함수는 직선(y = 2x + 1)을 정의합니다. 보시다시피 line_conf()에서 line 함수를 호출할 수 있지만 범위 외부에서 line을 호출하면 다음 오류가 발생합니다.
NameError: name 'line' is not defined
이는 이미 범위 외부에 있음을 나타냅니다.
마찬가지로 람다를 사용하여 함수를 정의하는 경우 함수 개체의 범위는 람다가 위치한 수준과 동일합니다.
Closure
함수는 객체이므로 특정 함수의 반환 결과로 사용될 수 있습니다.
def line_conf(): def line(x): return 2*x+1 return line # return a function object my_line = line_conf() print(my_line(5))
위 코드는 성공적으로 실행될 수 있습니다. line_conf의 반환 결과는 line 개체에 할당됩니다. 위의 코드는 11을 인쇄합니다.
line() 정의에서 외부 변수를 참조하면 어떻게 되나요?
def line_conf(): b = 15 def line(x): return 2*x+b return line # return a function object b = 5 my_line = line_conf() print(my_line(5))
line으로 정의된 하위 프로그램 블록에서는 상위 변수 b가 참조되지만, b 정보는 line의 정의 외부에 존재하는 것을 알 수 있습니다(b의 정의는 line의 하위 프로그램 블록에 없습니다). 선). b를 line의 환경 변수라고 부릅니다. 실제로 line이 line_conf의 반환 값으로 사용되면 line에는 이미 b 값이 포함되어 있습니다(b는 line과 관련이 없지만).
위 코드는 25를 출력합니다. 즉, 라인에서 참조하는 b 값은 함수 객체 정의 시 참조할 수 있는 b 값입니다. 사용할 때의 b 값은 아닙니다.
함수와 해당 환경 변수가 함께클로저를 형성합니다. 파이썬에서 소위 클로저(closure)는 환경 변수의 값을 포함하는 함수 객체입니다. 환경 변수 값은 함수 객체의 __closure__ 속성에 저장됩니다. 예를 들어, 다음 코드:
def line_conf(): b = 15 def line(x): return 2*x+b return line # return a function object b = 5 my_line = line_conf() print(my_line.__closure__) print(my_line.__closure__[0].cell_contents)
def line_conf(a, b): def line(x): return ax + b return line line1 = line_conf(1, 1) line2 = line_conf(4, 5) print(line1(5), line2(5))
클로저 및 병렬 작업
병렬 컴퓨팅이 핫스팟이 되고 있습니다. 이는 함수형 프로그래밍이 다시 대중화되는 중요한 이유이기도 합니다. 함수형 프로그래밍은 1950년대부터 존재했지만 널리 사용되지는 않았습니다. 그러나 위에서 설명한 파이프라인 작업 병렬 클러스터링 프로세스는 함수형 프로그래밍에 완벽하게 적합합니다. 함수형 프로그래밍의 자연스러운 장점으로 인해 점점 더 많은 언어에서 함수형 프로그래밍 패러다임에 대한 지원을 추가하기 시작했습니다.
위 내용은 Python의 클로저 사용 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!