> 백엔드 개발 > 파이썬 튜토리얼 > Python의 클로저 사용 예

Python의 클로저 사용 예

黄舟
풀어 주다: 2017-10-02 19:43:43
원래의
1053명이 탐색했습니다.

이 글은 주로 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)
로그인 후 복사

__closure__에는 튜플이 포함되어 있습니다. 이 튜플의 각 요소는 셀 유형의 객체입니다. 첫 번째 셀에는 클로저를 생성할 때 환경 변수 b의 값인 정수 15가 포함되어 있는 것을 볼 수 있습니다.

클로저의 실제 예를 살펴보겠습니다.


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))
로그인 후 복사
이 예에서는 함수 라인과 환경 변수 a 및 b가 클로저를 형성합니다. 클로저를 생성할 때 line_conf의 매개변수 a, b를 통해 이 두 환경 변수의 값을 지정했습니다. 이로써 함수의 최종 형태(y = x + 1 및 y = 4x + 5)를 결정했습니다. . 다른 직선 표현 함수를 얻으려면 매개변수 a와 b만 변환하면 됩니다. 이를 통해 클로저가 코드 재사용성을 향상시키는 효과도 있음을 알 수 있습니다.

클로저가 없으면 직선 함수를 만들 때마다 a, b, x를 지정해야 합니다. 이런 방식으로 더 많은 매개변수를 전달하고 코드의 이식성을 줄여야 합니다. 클로저를 사용하면 실제로 기능을 생성합니다. 선함수는 넓은 의미로 함수를 정의합니다. 이 함수의 일부 측면은 이미 결정되어 있지만(직선이어야 함) 다른 측면(예: a 및 b 매개변수는 결정되지 않음) 그 후, line_conf에 전달된 매개변수를 기반으로 클로저 형태의 최종 함수를 결정합니다.

클로저 및 병렬 작업

클로저는 함수에 대해 정의해야 하는 매개변수 수를 효과적으로 줄입니다. 이는 병렬 작업에 중요한 의미를 갖습니다. 병렬 컴퓨팅 환경에서는 각 컴퓨터가 기능을 담당하도록 한 다음 한 컴퓨터의 출력을 다음 컴퓨터의 입력과 연결할 수 있습니다. 궁극적으로 우리는 일련의 컴퓨터 클러스터 중 한쪽 끝에서 데이터를 입력하고 다른 쪽 끝에서 데이터를 출력하는 조립 라인처럼 작업합니다. 이 상황은 매개변수 입력이 하나만 있는 기능에 가장 적합합니다. 클로저는 이러한 목적을 달성할 수 있습니다.

병렬 컴퓨팅이 핫스팟이 되고 있습니다. 이는 함수형 프로그래밍이 다시 대중화되는 중요한 이유이기도 합니다. 함수형 프로그래밍은 1950년대부터 존재했지만 널리 사용되지는 않았습니다. 그러나 위에서 설명한 파이프라인 작업 병렬 클러스터링 프로세스는 함수형 프로그래밍에 완벽하게 적합합니다. 함수형 프로그래밍의 자연스러운 장점으로 인해 점점 더 많은 언어에서 함수형 프로그래밍 패러다임에 대한 지원을 추가하기 시작했습니다.

위 내용은 Python의 클로저 사용 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿