Python 기초 튜 토리 얼 의 폐쇄 적 인 사용 방법

4582 단어 Python폐쇄 하 다
Python 기초 튜 토리 얼 의 폐쇄 적 인 사용 방법
선언:
패 킷(closure)은 함수 식 프로 그래 밍 의 중요 한 문법 구조 이다.함수 식 프로 그래 밍 은 일종 의 프로 그래 밍 모델 이다.프로 세 스 프로 그래 밍 에서 함수(function)를 본 적 이 있 습 니 다.대상 을 대상 으로 프로 그래 밍 하 는 과정 에서 우 리 는 대상(object)을 본 적 이 있다.함수 와 대상 의 근본 적 인 목적 은 특정한 논리 적 방식 으로 코드 를 조직 하고 코드 의 중복 사용 성(reusability)을 향상 시 키 는 것 이다.패 킷 을 닫 는 것 도 조직 코드 의 구조 로 코드 의 중복 사용 성 을 높 였 다.
서로 다른 언어 가 폐쇄 를 실현 하 는 방식 이 다르다.Python 은 함수 대상 을 바탕 으로 이 문법 구 조 를 닫 는 데 지원 을 제공 합 니 다(우 리 는 특수 한 방법 과 다 중 범례 에서 Python 사용 대상 이 특수 한 문법 을 실현 하 는 것 을 여러 번 보 았 습 니 다).Python 은 모든 것 이 대상 이 고 함수 라 는 문법 구조 도 대상 입 니 다.함수 대상 에서 우 리 는 일반적인 대상 을 사용 하 는 것 처럼 함수 대상 을 사용 합 니 다.예 를 들 어 함수 대상 의 이름 을 변경 하거나 함수 대상 을 매개 변수 로 전달 합 니 다.
 함수 대상 의 역할 영역
다른 대상 과 마찬가지 로 함수 대상 도 생존 범위,즉 함수 대상 의 역할 영역 이 있다.함수 대상 은 def 문 구 를 사용 하여 정의 되 며 함수 대상 의 역할 영역 은 def 가 있 는 등급 과 같 습 니 다.예 를 들 어 아래 코드,우 리 는 lineconf 함수 의 예속 범위 내 에서 정 의 된 함수 line 은 lineconf 의 예속 범위 내 호출.

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)을 정의 합 니 다.보 입 니 다.lineconf()에서 line 함 수 를 호출 할 수 있 으 며,역할 영역 밖에서 line 을 호출 하면 다음 과 같은 오류 가 발생 합 니 다.

NameError: name 'line' is not defined
이 때 는 이미 작용 역 밖 에 있다 는 뜻 이다.
마찬가지 로 lambda 정의 함 수 를 사용 하면 함수 대상 의 역할 영역 은 lambda 가 있 는 등급 과 같 습 니 다.
 폐쇄 하 다
함 수 는 하나의 대상 이기 때문에 어떤 함수 의 반환 결과 로 할 수 있다.

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 의 반환 결 과 는 라인 대상 에 게 부 여 됩 니 다.위의 코드 는 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))    

라인 이 정의 하 는 예속 프로그램 블록 에서 고위 층 변수 b 를 인 용 했 지만 b 정 보 는 라인 의 정의 외 에 존재 합 니 다(b 의 정 의 는 라인 의 예속 프로그램 블록 에 있 지 않 습 니 다).우 리 는 b 를 라인 의 환경 변수 라 고 부른다.사실 line 은 lineconf 의 반환 값 은 라인 에 b 의 값 이 포함 되 어 있 습 니 다(b 가 라인 에 속 하지 않 음 에 도 불구 하고).
위의 코드 는 25 를 인쇄 합 니 다.즉,line 이 참조 하 는 b 값 은 함수 대상 이 정의 할 때 참고 할 수 있 는 b 값 이지 사용 할 때의 b 값 이 아 닙 니 다.
하나의 함수 와 그 환경 변 수 를 합 쳐 하나의 패 킷(closure)을 구성 합 니 다.Python 에서 이른바 패 킷 은 환경 변 수 를 포함 하 는 함수 대상 입 니 다.환경 변수 추출 값 이 함수 대상 에 저 장 된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__원 그룹(tuple)이 포함 되 어 있 습 니 다.이 모듈 의 모든 요 소 는 cell 형식의 대상 입 니 다.우 리 는 첫 번 째 cell 에 포 함 된 정수 15,즉 우리 가 패 킷 을 만 들 때 환경 변수 b 의 값 을 보 았 다.
다음은 폐쇄 적 인 실제 예 를 보 겠 습 니 다.

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 를 동시에 설명해 야 합 니 다.이렇게 하면 우 리 는 더 많은 매개 변수 전달 이 필요 하고 코드 의 이식 가능성 도 줄 일 수 있다.폐쇄 를 이용 하여 우 리 는 실제로 팬 레 터 를 만 들 었 다.line 함 수 는 광범 위 한 의미 의 함 수 를 정의 합 니 다.이 함수 의 일 부 는 이미 확정 되 었 으 나,다른 일 부 는(예 를 들 어 a 와 b 매개 변수 미 정).그리고 우 리 는 lineconf 가 전달 하 는 매개 변 수 는 패키지 형식 을 통 해 최종 함 수 를 확정 합 니 다.
패키지 와 병렬 연산
패 킷 을 닫 으 면 함수 가 정의 해 야 할 매개 변수 수 를 효과적으로 줄 일 수 있 습 니 다.이것 은 병렬 연산 에 있어 서 중요 한 의의 가 있다.병렬 연산 환경 에서 우 리 는 모든 컴퓨터 에 함 수 를 책임 지게 한 후에 컴퓨터 의 출력 과 다음 컴퓨터 의 입력 을 연결 할 수 있다.결국,우 리 는 유수 선 처럼 일 하고,직렬 로 연 결 된 컴퓨터 집단 한 끝 에서 데 이 터 를 입력 하고,다른 한 끝 에서 데 이 터 를 출력 한다.이러한 상황 은 하나의 매개 변수 만 입력 하 는 함수 에 가장 적합 하 다.폐쇄 하면 이 목적 을 실현 할 수 있다.
병렬 연산 은 바로 핫 이 슈 라 고 부른다.이것 도 함수 식 프로 그래 밍 이 또 뜨 거 워 지 는 중요 한 원인 이다.함수 식 프로 그래 밍 은 1950 년대 에 이미 존 재 했 지만 응용 은 광범 위 하지 않다.그러나 우리 가 위 에서 묘사 한 유수 선 식 작업 병행 집단 과정 은 함수 식 프로 그래 밍 에 적합 하 다.함수 식 프로 그래 밍 이라는 천연 적 인 장점 으로 인해 점점 더 많은 언어 도 함수 식 프로 그래 밍 패 러 다 임 에 대한 지원 을 추가 하기 시작 했다.
궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기