백엔드 개발 파이썬 튜토리얼 Python의 클로저에 대해 간략하게 설명

Python의 클로저에 대해 간략하게 설명

Dec 05, 2016 pm 01:27 PM
python 폐쇄

Python의 클로저

요 며칠 전에 누군가가 메시지를 남겼는데, 闭包re.sub 중 어느 하나의 용도가 명확하지 않습니다. Script Home을 검색해 보니 클로저와 관련된 내용을 작성한 적이 없어서 Python의 내용을 요약하고 개선하기로 결정했습니다.

1. 폐쇄의 개념

우선 클로저란 무엇인가에 대한 기본 개념부터 시작해야 합니다. Wiki의 설명을 살펴보겠습니다.

코드 복사 코드는 다음과 같습니다.
컴퓨터 공학에서 클로저는 Lexical closure의 약자로 free를 참조하는 함수입니다. 변수. 참조된 자유 변수는 그것이 생성된 환경을 떠난 후에도 함수에 남아 있습니다. 따라서 클로저는 함수와 관련 참조 환경으로 구성된 엔터티라고 말하는 또 다른 방법이 있습니다. 클로저는 런타임에 여러 인스턴스를 가질 수 있으며, 서로 다른 참조 환경과 동일한 함수 조합이 서로 다른 인스턴스를 생성할 수 있습니다.
....

위에 언급된 두 가지 핵심 사항은 자유 변수와 함수입니다. 이 두 가지 키에 대해서는 나중에 설명하겠습니다. "클로저"의 의미에 대해서는 아직 자세히 설명할 필요가 있습니다. 텍스트에서 알 수 있듯이 닫힌 패키지로 생생하게 이해할 수 있습니다. 물론 함수 내부에도 해당 논리가 있습니다. 패키지 내부는 자유입니다. 자유 변수는 패키지와 함께 돌아다닐 수 있습니다. 물론, 이 패키지가 생성된다는 전제가 있어야 합니다.

파이썬 언어를 통해 소개하겠습니다. 클로저는 함수 A를 호출하고 이 함수 A는 함수 B를 반환한다는 의미입니다. 이렇게 반환된 함수 B를 클로저라고 합니다. 함수 A를 호출할 때 전달하는 매개변수는 자유 변수입니다.

예:

def func(name):
 def inner_func(age):
  print 'name:', name, 'age:', age
 return inner_func

bb = func('the5fire')
bb(26) # >>> name: the5fire age: 26

로그인 후 복사

여기에서 func가 호출되면 클로저 - inner_func가 생성되고 클로저는 자유 변수인 name을 보유합니다. 따라서 이는 함수 func의 수명 주기가 끝날 때 변수 이름이 참조되기 때문에 Exists로 유지된다는 의미이기도 합니다. 폐쇄되므로 재활용되지 않습니다.

한 가지 더, 폐쇄는 Python에서 고유한 개념이 아닙니다. 함수를 일급 시민으로 취급하는 모든 언어에는 폐쇄라는 개념이 있습니다. 그러나 클래스가 일급 시민인 Java와 같은 언어에서도 클로저를 사용할 수 있지만 클래스나 인터페이스를 사용하여 구현해야 합니다.

자세한 개념정보는 마지막 참고링크를 참고해주세요.

2. 클로저를 사용하는 이유

위의 소개를 토대로 독자들은 이것이 클래스와 다소 비슷하다고 느낄지 궁금합니다. 유사점은 둘 다 데이터 캡슐화를 제공한다는 것입니다. 차이점은 클로저 자체가 메소드라는 점입니다. 클래스와 마찬가지로 우리는 공통 기능을 재사용하기 위해 프로그래밍할 때(물론 실제 비즈니스를 모델링할 때에도) 일반적인 것을 클래스로 추상화하는 경우가 많습니다. 클로저의 경우에도 마찬가지입니다. 함수별로 세분화된 추상화가 필요한 경우 클로저가 좋은 선택입니다.

이 시점에서 클로저는 읽기 전용 객체로 이해할 수 있습니다. 클로저에 속성을 전달할 수 있지만 실행 인터페이스만 제공할 수 있습니다. 따라서 프로그램에서는 나중에 언급할 데코레이터와 같은 공통 기능을 완성하는 데 도움이 되는 함수 객체(클로저)가 종종 필요합니다.

3. 클로저 사용

Python에서 매우 중요하고 일반적인 사용 시나리오인 첫 번째 시나리오는 데코레이터입니다. Python은 데코레이터를 위한 매우 친숙한 "구문 설탕"을 제공합니다. 이를 통해 장식을 매우 편리하게 사용할 수 있습니다. 간단히 말해서, @ decorator_func를 func 함수에 추가하면 decorator_func(func):

와 동일합니다.
def decorator_func(func):
 def wrapper(*args, **kwargs):
  return func(*args, **kwargs)
 return wrapper

@decorator_func
def func(name):
 print 'my name is', name

# 等价于
decorator_func(func)

로그인 후 복사

이 데코레이터 예에서 클로저(래퍼)는 외부 func 매개변수를 보유하고 외부에서 전달된 매개변수를 허용할 수 있습니다. 수신된 매개변수는 그대로 func에 전달되어 실행 결과로 반환됩니다.

이것은 간단한 예입니다. 자주 사용되는 LRUCache 데코레이터와 같이 여러 개의 클로저를 가질 수 있습니다. 데코레이터는 @lru_cache(expire=500)와 같은 매개변수를 허용할 수 있습니다. 구현은 두 개의 클로저를 중첩하는 것입니다:

def lru_cache(expire=5):
 # 默认5s超时
 def func_wrapper(func):
  def inner(*args, **kwargs):
   # cache 处理 bala bala bala
   return func(*args, **kwargs)
  return inner
 return func_wrapper

@lru_cache(expire=10*60)
def get(request, pk)
 # 省略具体代码
 return response()

로그인 후 복사

클로저에 대해 잘 모르는 학생들은 위의 코드를 이해할 수 있어야 합니다. 이전 인터뷰에서 자주 받았던 질문입니다.

두 번째 시나리오는 클로저의 특징인 "지연 평가"를 기반으로 합니다. 이 애플리케이션은 데이터베이스에 액세스할 때 더 일반적입니다. 예:

# 伪代码示意

class QuerySet(object):
 def __init__(self, sql):
  self.sql = sql
  self.db = Mysql.connect().corsor() # 伪代码

 def __call__(self):
  return db.execute(self.sql)

def query(sql):
 return QuerySet(sql)

result = query("select name from user_app")
if time > now:
 print result # 这时才执行数据库访问

로그인 후 복사

위의 부적절한 예는 클로저를 통한 지연 평가 기능을 보여 주지만 위 쿼리에서 반환된 결과는 함수가 아니라 함수 함수를 포함하는 클래스입니다. 관심이 있다면 Django의 쿼리셋 구현을 살펴보세요. 원리는 비슷합니다.

세 번째 시나리오는 특정 함수의 매개변수를 미리 할당해야 하는 상황입니다. 물론 Python에는 functools.parial에 액세스하는 좋은 솔루션이 이미 있지만 클로저를 사용하여 달성할 수도 있습니다.

def partial(**outer_kwargs):
 def wrapper(func):
  def inner(*args, **kwargs):
   for k, v in outer_kwargs.items():
    kwargs[k] = v
   return func(*args, **kwargs)
  return inner
 return wrapper

@partial(age=15)
def say(name=None, age=None):
 print name, age

say(name="the5fire")
# 当然用functools比这个简单多了
# 只需要: functools.partial(say, age=15)(name='the5fire')

로그인 후 복사

또 다른 억지스러운 예인 것 같지만 클로저 적용을 실천한 것이라고 볼 수 있습니다.

마지막으로 클로저는 이해하기 쉽고 Python에서 널리 사용됩니다. 이 글은 클로저에 대한 요약입니다. 궁금한 점이 있으면 메시지를 남겨주세요.

4. 참고자료

위키피디아-폐쇄

http://stackoverflow.com/questions/4020419/closures-in-python

http://www.shutupandship.com/2012/01/python-closures-explained.html

http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to-언어-x-closures

http://mrevelle.blogspot.com/2006/10/closure-on-closures.html

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 및 Python : 코드 예제 및 비교 PHP 및 Python : 코드 예제 및 비교 Apr 15, 2025 am 12:07 AM

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.

Centos에서 Pytorch 모델을 훈련시키는 방법 Centos에서 Pytorch 모델을 훈련시키는 방법 Apr 14, 2025 pm 03:03 PM

CentOS 시스템에서 Pytorch 모델을 효율적으로 교육하려면 단계가 필요 하며이 기사는 자세한 가이드를 제공합니다. 1. 환경 준비 : 파이썬 및 종속성 설치 : CentOS 시스템은 일반적으로 파이썬을 사전 설치하지만 버전은 더 오래 될 수 있습니다. YUM 또는 DNF를 사용하여 Python 3 및 Upgrade Pip : Sudoyumupdatepython3 (또는 SudodnfupdatePython3), PIP3INSTALL-UPGRADEPIP를 설치하는 것이 좋습니다. CUDA 및 CUDNN (GPU 가속도) : NVIDIAGPU를 사용하는 경우 Cudatool을 설치해야합니다.

Centos에서 Pytorch에 대한 GPU 지원은 어떻습니까? Centos에서 Pytorch에 대한 GPU 지원은 어떻습니까? Apr 14, 2025 pm 06:48 PM

CentOS 시스템에서 Pytorch GPU 가속도를 활성화하려면 Cuda, Cudnn 및 GPU 버전의 Pytorch를 설치해야합니다. 다음 단계는 프로세스를 안내합니다. CUDA 및 CUDNN 설치 CUDA 버전 호환성 결정 : NVIDIA-SMI 명령을 사용하여 NVIDIA 그래픽 카드에서 지원하는 CUDA 버전을보십시오. 예를 들어, MX450 그래픽 카드는 CUDA11.1 이상을 지원할 수 있습니다. Cudatoolkit 다운로드 및 설치 : NVIDIACUDATOOLKIT의 공식 웹 사이트를 방문하여 그래픽 카드에서 지원하는 가장 높은 CUDA 버전에 따라 해당 버전을 다운로드하여 설치하십시오. CUDNN 라이브러리 설치 :

Docker 원리에 대한 자세한 설명 Docker 원리에 대한 자세한 설명 Apr 14, 2025 pm 11:57 PM

Docker는 Linux 커널 기능을 사용하여 효율적이고 고립 된 응용 프로그램 실행 환경을 제공합니다. 작동 원리는 다음과 같습니다. 1. 거울은 읽기 전용 템플릿으로 사용되며, 여기에는 응용 프로그램을 실행하는 데 필요한 모든 것을 포함합니다. 2. Union 파일 시스템 (Unionfs)은 여러 파일 시스템을 스택하고 차이점 만 저장하고 공간을 절약하고 속도를 높입니다. 3. 데몬은 거울과 컨테이너를 관리하고 클라이언트는 상호 작용을 위해 사용합니다. 4. 네임 스페이스 및 CGroup은 컨테이너 격리 및 자원 제한을 구현합니다. 5. 다중 네트워크 모드는 컨테이너 상호 연결을 지원합니다. 이러한 핵심 개념을 이해 함으로써만 Docker를 더 잘 활용할 수 있습니다.

Python vs. JavaScript : 커뮤니티, 라이브러리 및 리소스 Python vs. JavaScript : 커뮤니티, 라이브러리 및 리소스 Apr 15, 2025 am 12:16 AM

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

Centos에서 Pytorch 버전을 선택하는 방법 Centos에서 Pytorch 버전을 선택하는 방법 Apr 14, 2025 pm 02:51 PM

Centos에서 Pytorch 버전을 선택할 때 다음과 같은 주요 요소를 고려해야합니다. 1. Cuda 버전 호환성 GPU 지원 : NVIDIA GPU가 있고 GPU 가속도를 사용하려면 해당 CUDA 버전을 지원하는 Pytorch를 선택해야합니다. NVIDIA-SMI 명령을 실행하여 지원되는 CUDA 버전을 볼 수 있습니다. CPU 버전 : GPU가 없거나 GPU를 사용하지 않으려면 Pytorch의 CPU 버전을 선택할 수 있습니다. 2. 파이썬 버전 Pytorch

Centos에 nginx를 설치하는 방법 Centos에 nginx를 설치하는 방법 Apr 14, 2025 pm 08:06 PM

Centos Nginx를 설치하려면 다음 단계를 수행해야합니다. 개발 도구, PCRE-DEVEL 및 OPENSSL-DEVEL과 같은 종속성 설치. nginx 소스 코드 패키지를 다운로드하고 압축을 풀고 컴파일하고 설치하고 설치 경로를/usr/local/nginx로 지정하십시오. nginx 사용자 및 사용자 그룹을 만들고 권한을 설정하십시오. 구성 파일 nginx.conf를 수정하고 청취 포트 및 도메인 이름/IP 주소를 구성하십시오. Nginx 서비스를 시작하십시오. 종속성 문제, 포트 충돌 및 구성 파일 오류와 같은 일반적인 오류는주의를 기울여야합니다. 캐시를 켜고 작업자 프로세스 수 조정과 같은 특정 상황에 따라 성능 최적화를 조정해야합니다.

Centos에서 Pytorch의 분산 교육을 운영하는 방법 Centos에서 Pytorch의 분산 교육을 운영하는 방법 Apr 14, 2025 pm 06:36 PM

CentOS 시스템에 대한 Pytorch 분산 교육에는 다음 단계가 필요합니다. Pytorch 설치 : 전제는 Python과 PIP가 CentOS 시스템에 설치된다는 것입니다. CUDA 버전에 따라 Pytorch 공식 웹 사이트에서 적절한 설치 명령을 받으십시오. CPU 전용 교육의 경우 다음 명령을 사용할 수 있습니다. PipinStalltorchtorchvisiontorchaudio GPU 지원이 필요한 경우 CUDA 및 CUDNN의 해당 버전이 설치되어 있는지 확인하고 해당 PyTorch 버전을 설치하려면 설치하십시오. 분산 환경 구성 : 분산 교육에는 일반적으로 여러 기계 또는 단일 기계 다중 GPU가 필요합니다. 장소

See all articles