>  기사  >  백엔드 개발  >  Python에서 클로저란 무엇입니까? 응용 프로그램은 무엇입니까?

Python에서 클로저란 무엇입니까? 응용 프로그램은 무엇입니까?

不言
不言앞으로
2018-10-13 14:53:212451검색

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

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 lazy_sum.<locals>.sum at 0x013DD618>
>>> f2
<function lazy_sum.<locals>.sum at 0x02F92DF8>
>>> f1 == f2
False
>>> f1() == f2()
True
>>> f1()
25
>>> f2()
25
>>> id(f1())
1627215984
>>> id(f2())
1627215984
설명: 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.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제