찾다
백엔드 개발파이썬 튜토리얼Python에서 클로저란 무엇입니까? 응용 프로그램은 무엇입니까?

이 글의 내용은 파이썬에서 클로저란 무엇인가에 관한 것입니다. 응용 프로그램은 무엇입니까? 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. 반환 값으로서의 함수

"클로저"를 소개하기 전에 먼저 반환 값으로서의 함수의 상황을 이해해 봅시다.
고차 함수는 함수를 매개변수로 받는 것 외에도 함수를 결과 값으로 반환할 수도 있습니다. 예를 들어 앞서 소개한 데코레이터에서는 함수를 반환값으로 사용한다.

2. 폐쇄

1. 폐쇄의 조건과 효과

폐쇄란?
함수 내에 다른 함수를 중첩할 때 내부 함수가 외부 함수의 변수를 참조하면 클로저가 발생할 수 있습니다.
그래서클로저 생성을 위한 세 가지 조건(하나는 필수):

  • 1. 내부 함수는 중첩되어야 합니다

  • 2.

  • 3. 외부 함수는 내부 함수를 반환해야 합니다
  • 그렇다면 클로저를 시도해야 하는 이유와 클로저의 역할은 무엇일까요?

1. 클로저는 외부 함수의 로컬 변수에 따라 다른 결과를 얻을 수 있습니다
  • 2. 클로저가 실행된 후에도 현재 실행 환경이 계속 유지될 수 있으며 실행 결과는 마지막 시간에 따라 달라집니다. 함수가 실행되었습니다.
  • 2. 클로저 예시

Chestnut 1: 수열의 합을 구합니다
>>> def calc_sum(*args):
...     ax = 0
...     for n in args:
...         ax = ax + n
...     return ax  # 返回变量
...
>>> calc_sum(1,2,3)
6

하지만 이제 요구사항이 있으면 합산 결과를 구할 필요가 없습니다. 즉시, 하지만 다음 코드에서는 필요에 따라 계산합니다. 어떻게 해야 할까요?

합산 결과를 반환할 수는 없지만 다음과 같이 합산 함수를 반환합니다.

>>>def lazy_sum(*args):
...    def sum():            # sum()是内部函数,可以利用外部函数的参数
...        ax = 0
...        for n in args:    # sum()中使用外部函数的局部变量
...            ax = ax + n 
...        return ax
...    return sum            # 形成闭包,此时,*args保存在返回的函数中
...
>>>f = lazy_sum(1,3,5,7,9)
>>>f          # 此时返回的是求和函数
>>> f()       # 调用函数f()时,才真正计算求和的结果
25

참고:

lazy_sum() 함수의 내부 실행 순서는 f를 실행하면 반환 합계까지 실행되며 *args는 save in the return 함수에서는 sum() 함수가 반환됩니다. f()를 실행하면 sum()을 실행하는 것과 동일하며 *args를 포함합니다.

lazy_sun()을 호출하면 매번 새로운 함수가 반환되며, 동일한 매개변수가 전달되더라도 f() 호출의 결과는 영향을 받지 않습니다.

두 번째 점을 확인해 보겠습니다.

# 但是调用 f1() 与f2()的调用结果互不影响
>>> f1 = lazy_sum(1,3,5,7,9)
>>> f2 = lazy_sum(1,3,5,7,9)
>>> f1
<function>.sum at 0x013DD618>
>>> f2
<function>.sum at 0x02F92DF8>
>>> f1 == f2
False
>>> f1() == f2()
True
>>> f1()
25
>>> f2()
25
>>> id(f1())
1627215984
>>> id(f2())
1627215984</function></function>
설명: f1과 f2의 반환 함수 위치가 다르기 때문에 f1==f2의 반환 결과는 False입니다.

그러나 최종 실행 결과에는 영향을 미치지 않습니다. f1()과 f2()의 실행 결과는 모두 25이며 동일한 영역을 가리키는 id()로 볼 수 있습니다.

Chestnut 2:

def count():
    fs = []
    for i in range(1, 4):
        def f():         # 返回函数f()放在循环里
            return i*i
    fs.append(f)
    return fs
f1, f2, f3 = count()
실제 실행 결과는 f1=9 f2=9 f3=9

실제로 생각하신 것과 조금 다를 수 있습니다([1,4,9]). f() 함수는 for 루프에 배치되기 때문에 루프가 종료되어야 최종적으로 i=3의 실행 결과 9가 반환됩니다.

따라서 반환 함수는 루프 변수나 이후에 변경될 수 있는 수량을 참조하지 않는 것이 가장 좋습니다. 그럼 어떻게 수정하나요?

def count():
    def f(j):
        def g():
            return j*j      # 形成闭包
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i))      # 一个i值进入后,f(i)立刻被执行,并加入到fs中
    return fs

f1, f2, f3 = count()  # 返回函数g没有引用j

최종 결과: [1,4,9] 즉, f1=1 f2=4 f3=

3. 익명 함수 Lambda

정의: 익명 함수는 필요하지 않은 유형의 함수를 의미합니다. 식별자 함수 이름이나 서브루틴을 정의합니다. Python을 사용하면 람다 키워드를 사용하여 익명 함수를 만들 수 있습니다.

문법: 람다 매개변수: 표현식

또는 람다 형식 매개변수 1,..., 형식 매개변수 n: 함수(형식 매개변수), 입력 매개변수 1,..., 입력 매개변수 n

참고: 1. 람다 함수는 다음을 수행할 수 있습니다. 원하는 수의 매개변수를 수신하고 단일 표현식의 값을 반환합니다.
2. Lambda는 명령을 포함할 수 없으며 둘 이상의 표현식을 반환할 수 없습니다.

장점: 1. 함수 정의 과정을 절약하고 코드를 단순화할 수 있습니다.
2. 재사용되지 않는 일부 추상 함수를 람다로 정의할 수 있습니다.


예:

>>> list( map( lambda x: x*x ,[1,2,3] ) )
[1, 4, 9]

의 기능.

lamdba x : x*x 实现的是:def f(x): return x*x

익명 함수를 변수에 할당한 다음 변수를 사용하여 함수를 호출할 수 있습니다. 예:
  • >>> f = lambda x:x*x  
    >>> f(5) # 调用
    >>> g = lambda x,y=2 : x*y
    >>> g(2,4)
    8
    >>> g(2)    # 默认y=2
    4
익명 함수를 반환 값으로 반환할 수 있습니다. 예:
  • return lambda x:x*x

위 내용은 Python에서 클로저란 무엇입니까? 응용 프로그램은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 segmentfault思否에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
파이썬 스크립트가 UNIX에서 실행되지 않는 일반적인 이유는 무엇입니까?파이썬 스크립트가 UNIX에서 실행되지 않는 일반적인 이유는 무엇입니까?Apr 28, 2025 am 12:18 AM

Python 스크립트가 UNIX 시스템에서 실행할 수없는 이유는 다음과 같습니다. 1) CHMOD XYOUR_SCRIPT.PY를 사용하여 실행 권한을 부여하는 권한이 불충분합니다. 2) 잘못되거나 누락 된 Shebang 라인은 #!/usr/bin/envpython을 사용해야합니다. 3) 잘못된 환경 변수 설정, os.environ 디버깅을 인쇄 할 수 있습니다. 4) 잘못된 Python 버전을 사용하여 Shebang 행 또는 명령 줄에 버전을 지정할 수 있습니다. 5) 가상 환경을 사용하여 종속성을 분리하는 의존성 문제; 6) 구문 오류, python-mpy_compileyour_script.py를 사용하여 감지하십시오.

파이썬 어레이를 사용하는 것이 목록을 사용하는 것보다 더 적절한 시나리오의 예를 제시하십시오.파이썬 어레이를 사용하는 것이 목록을 사용하는 것보다 더 적절한 시나리오의 예를 제시하십시오.Apr 28, 2025 am 12:15 AM

파이썬 어레이를 사용하는 것은 목록보다 많은 양의 숫자 데이터를 처리하는 데 더 적합합니다. 1) 배열 더 많은 메모리를 저장, 2) 배열은 숫자 값으로 작동하는 것이 더 빠르며, 3) 배열 힘 유형 일관성, 4) 배열은 C 배열과 호환되지만 목록만큼 유연하고 편리하지 않습니다.

Python에서 목록 대 배열 사용의 성능은 무엇입니까?Python에서 목록 대 배열 사용의 성능은 무엇입니까?Apr 28, 2025 am 12:10 AM

더 나은 orfelexibility 및 mixdatatatatytys, 탁월한 정비 계산 모래 데이터 세트.

Numpy는 대형 배열의 메모리 관리를 어떻게 처리합니까?Numpy는 대형 배열의 메모리 관리를 어떻게 처리합니까?Apr 28, 2025 am 12:07 AM

numpymanagesmemoryforlargearraysefficiedviews, 사본 및 메모리-맵핑 파일

모듈 가져와 목록 또는 배열을 가져와야합니까?모듈 가져와 목록 또는 배열을 가져와야합니까?Apr 28, 2025 am 12:06 AM

ListSinpythondonoTrequireimportingAmodule, whilearraysfromtheArrayModuledOneedAnimport.1) ListSareBuilt-in, Versatile, andCanholdixedDatatypes.2) arraysarraysaremorememorememeMorememeMorememeMorememeMorememeMorememeMorememeMoremeMoremeTeverTopeTeveTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeveTeTeTeTeTeTeTeTete가 필요합니다.

파이썬 어레이에 어떤 데이터 유형을 저장할 수 있습니까?파이썬 어레이에 어떤 데이터 유형을 저장할 수 있습니까?Apr 27, 2025 am 12:11 AM

PythonlistsCanstoreAnyDatAtype, ArrayModuLearRaysStoreOneType 및 NUMPYARRAYSAREFORNUMERICALPUTATION.1) LISTSAREVERSATILEBUTLESSMEMORY-EFFICENT.2) ARRAYMODUERRAYRAYRAYSARRYSARESARESARESARESARESARESAREDOREDORY-UNFICEDONOUNEOUSDATA.3) NumpyArraysUraysOrcepperperperperperperperperperperperperperperperferperferperferferpercient

파이썬 어레이에 잘못된 데이터 유형의 값을 저장하려고하면 어떻게됩니까?파이썬 어레이에 잘못된 데이터 유형의 값을 저장하려고하면 어떻게됩니까?Apr 27, 2025 am 12:10 AM

whenyouattempttoreavalueofthewrongdatatypeinapythonaphonarray, thisiSdueTotheArrayModule의 stricttyPeenforcement, theAllElementStobeofthesAmetypecified bythetypecode.forperformancersassion, arraysaremoreficats the thraysaremoreficats thetheperfication the thraysaremorefications는

Python Standard Library의 일부는 무엇입니까? 목록 또는 배열은 무엇입니까?Python Standard Library의 일부는 무엇입니까? 목록 또는 배열은 무엇입니까?Apr 27, 2025 am 12:03 AM

Pythonlistsarepartoftsandardlardlibrary, whileraysarenot.listsarebuilt-in, 다재다능하고, 수집 할 수있는 반면, arraysarreprovidedByTearRaymoduledlesscommonlyusedDuetolimitedFunctionality.

See all articles

핫 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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

메모장++7.3.1

메모장++7.3.1

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

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음