파 이 썬 패 키 지 를 어떻게 이해 하고 사용 합 니까?

4919 단어 Python폐쇄 하 다
1.Python 의 역할 영역 규칙 과 내장 함수
함수 가 실 행 될 때마다 새로운 부분 네 임 스페이스 를 만 듭 니 다.함수 내 에서 분 배 된 함수 파라미터 와 변수 이름 을 포함 하 는 부분 환경 을 표시 합 니 다.우 리 는 이름 공간 을 하나의 사전 으로 볼 수 있 습 니 다.그 중에서 키 는 대상 이름 이 고 값 은 대상 자체 입 니 다.
이름 을 분석 할 때 해석 기 는 먼저 로 컬 네 임 스페이스 를 검색 합 니 다.일치 하지 않 으 면 전역 이름 공간 을 검색 합 니 다.이 이름 공간 은 함 수 를 정의 하 는 모듈 입 니 다.일치 하 는 항목 을 찾 지 못 하면 NameError 이상 이 발생 하기 전에 내 장 된 이름 공간 을 최종 적 으로 검사 합 니 다.다음 그림 은 이 점 을 설명 한다.

다음 의 예 를 고려 합 시다.

age = 27
def birthday(): 
  age = 28
birthday()
print(age)  # age will still be 27
>>
27
변수 가 함수 내부 에 값 을 부여 할 때 함수 의 로 컬 이름 공간 에 항상 연결 합 니 다.따라서 함수 체 의 변수 age 는 외부 변수 가 아 닌 28 값 을 포함 하 는 새로운 대상 을 말한다.전역 문 구 를 사용 하여 이 행동 을 변경 할 수 있 습 니 다.아래 의 예 는 이 점 을 강조 했다.

age = 27
name = "Sarah"
def birthday(): 
  global age       # 'age' is in global namespace 
  age = 28
  name = "Roark"
birthday()         # age is now 28. name will still be "Sarah"
Python 도 내장 함수 정의(함수 내부 함수)를 지원 합 니 다.

def countdown(start):
  # This is the outer enclosing function
  def display():
    # This is the nested function
    n = start
    while n > 0:
      n-=1
      print('T-minus %d' % n)
 
  display()
# We execute the function
countdown(3)
>>>
T-minus 3
T-minus 2
T-minus 1
2.패 킷 함수 정의
위의 예제 에서 함수 countdown()의 마지막 줄 이 호출 이 아 닌 display 함 수 를 되 돌려 주면 어떤 상황 이 발생 합 니까?이것 은 이 함수 의 정의 가 다음 과 같다 는 것 을 의미한다.

def countdown(start):
  # This is the outer enclosing function
  def display():
    # This is the nested function
    n = start
    while n > 0:
      n-=1
      print('T-minus %d' % n)
  return display
# Now let's try calling this function.
counter1 = countdown(2)
counter1()
>>>
T-minus 2
T-minus 1
값 2 를 사용 하여 countdown()함 수 를 호출 하고 돌아 오 는 함 수 를 이름 conter 1 에 연결 합 니 다.counter 1()을 실행 할 때,countdown()에 최초 로 제 공 된 start 값 을 사용 합 니 다.따라서 counter 1()을 호출 할 때 count 1()함 수 를 실 행 했 음 에 도 불구 하고 이 값 을 기억 합 니 다.
일부 데이터(이 예 에서 2)를 코드 에 추가 하 는 기술 은 Python 에서 패 킷 이 라 고 합 니 다.
변수 가 범 위 를 초과 하거나 함수 자체 가 현재 이름 공간 에서 제거 되 더 라 도 폐쇄 범위 의 이 값 을 기억 합 니 다.우 리 는 아래 의 코드 를 시도 해서 확인 할 수 있다.

>>> del countdown
>>> counter1()
T-minus 2
T-minus 1
>>> countdown(2)
Traceback (most recent call last):
...
NameError: name 'countdown' is not defined
3.폐쇄 는 언제 사용 합 니까?
하나의 유형 에서 실현 하 는 방법 이 매우 적 을 때(대부분 상황 에서 하나의 방법 만 있 을 때)가방 을 닫 으 면 대체 적 이 고 우아 한 해결 방안 을 제공 할 수 있다.또한,만약 우리 가 지연 되 거나 지연 되 는 개념 에 따라 코드 를 작성 하 기 를 원한 다 면,패키지 와 끼 워 넣 는 함수 가 특히 유용 합 니 다.다음은 하나의 예 이다.

from urllib.request import urlopen
def page(url): 
  def get(): 
    return urlopen(url).read() 
  return get
위의 예제 에서 page()함 수 는 실제로 어떠한 계산 도 실행 하지 않 습 니 다.반면 함수 get()을 만 들 고 되 돌려 줍 니 다.이 함 수 는 웹 페이지 를 호출 할 때 페이지 내용 을 가 져 옵 니 다.따라서 get()에서 실 행 된 계산 은 실제 get()을 계산 할 때 프로그램의 후속 점 으로 지연 된다.예 를 들 면:

>>> url1 = page("http://www.google.com") 
>>> url2 = page("http://www.bing.com") 
>>> url1
<function page.<locals>.get at 0x10a6054d0>
>>> url2
<function page.<locals>.get at 0x10a6055f0>
  
>>> gdata = url1()     # Fetches http://www.google.com 
>>> bdata = url2()     # Fetches http://www.bing.com
>>>
패 킷 함수 에 포 함 된 값 을 찾 을 수 있 습 니 다.
모든 함수 대상 은 하나closure_ 속성,패키지 함수 라면 이 속성 은 셀 대상 을 되 돌려 줍 니 다.위의 예 에 따 르 면 url 1 과 url 2 는 폐쇄 함수 라 는 것 을 알 고 있 습 니 다.

>>> page.__closure__       # Returns None since not a closure
>>> url1.__closure__
(<cell at 0x10a5f1250: str object at 0x10a5f3120>,)
셀 대상 은 닫 힌 값 을 저장 하 는 속성 이 있 습 니 다 cellcontents。

>>> url1.__closure__[0].cell_contents
'http://www.google.com'
>>> url2.__closure__[0].cell_contents
'http://www.bing.com'
총화
내장 함수 가 폐쇄 범위 의 값 을 참조 할 때 Python 의 패 킷 을 정의 할 수 있 습 니 다.패 킷 을 닫 고 어떤 형식의 데이터 숨 김 을 제공 합 니 다.패 킷 을 닫 는 것 은 효율 적 인 방법 으로 일련의 함수 호출 사이 에 상 태 를 유지 할 수 있다.Python 으로 패키지 함수 만 들 기:
4.567917.우 리 는 반드시 포 함 된 함수 가 있어 야 한다.4.567918.
4
  • 내장 함 수 는 폐쇄 함수 에서 정 의 된 값 을 참조 해 야 합 니 다
  • 폐쇄 함 수 는 반드시 내장 함 수 를 되 돌려 야 합 니 다
  • 파 이 썬 패 키 지 를 어떻게 이해 하고 사용 하 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 패 키 지 는 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기