>  기사  >  백엔드 개발  >  Python의 `send` 기능은 어떻게 생성기와의 양방향 통신을 허용합니까?

Python의 `send` 기능은 어떻게 생성기와의 양방향 통신을 허용합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-02 19:12:30322검색

How does Python's `send` function allow for two-way communication with generators?

Python 생성기에서 "send" 역할 이해

Python의 "yield" 키워드를 사용하면 생성기가 값을 산출하여 호출자가 이를 허용할 수 있습니다. 생성기의 출력을 반복합니다. 그러나 생성기는 추가 제어 계층을 제공하는 "send"라는 보완 기능도 제공합니다.

"generator.send(value)"로 문서화된 "send" 함수를 사용하면 호출자가 다음을 입력할 수 있습니다. 방금 산출된 발전기에 가치를 부여합니다. 이 입력 값은 현재 항복 표현식의 결과가 됩니다. 중요한 것은 생성기 함수가 처음 인스턴스화될 때 생성기 함수에 전달된 인수 값과 다르다는 것입니다.

설명하기 위해 다음 생성기를 고려하십시오.

<code class="python">def double_inputs():
    while True:
        x = yield  # Pauses the generator
        yield x * 2  # Returns the doubled value</code>

처음에는 next(gen)를 호출합니다. 생성기 개체에서 gen은 첫 번째 항복 문으로 실행을 진행합니다. 이 시점에서 "send" 기능을 활용하여 값을 입력할 수 있습니다. 예를 들어, gen.send(10)을 실행하면 x가 10으로 설정되고 생성기가 다시 시작되어 결과적으로 20이 생성됩니다.

<code class="python">gen = double_inputs()
next(gen)       # Pause at first yield
gen.send(10)    # Send input value of 10
20</code>

이 프로세스를 반복하여 여러 입력을 생성기로 보낼 수 있습니다. . 이 기능은 "수율" 메커니즘을 통해서만 달성할 수 없다는 점은 주목할 가치가 있습니다.

"전송" 기능의 실제 적용 중 하나는 Twisted의 @defer.inlineCallbacks 데코레이터 컨텍스트에 있습니다. 표준 절차 함수와 유사하지만 비동기 계산 및 콜백을 수행할 수 있는 함수 생성이 가능합니다.

예를 들어 "send" 함수를 사용하면 다음 코드를 현대화할 수 있습니다.

<code class="python"># Old approach with callbacks
def doStuff():
    returnDeferred = defer.Deferred()
    def gotNextResult(nextResult):
        returnDeferred.callback(nextResult / 10)
    def gotResult(result):
        takesTenSeconds(result * 10).addCallback(gotNextResult)
    takesTwoSeconds().addCallback(gotResult)
    return returnDeferred

# New approach using @defer.inlineCallbacks
@defer.inlineCallbacks
def doStuff():
    result = yield takesTwoSeconds()
    nextResult = yield takesTenSeconds(result * 10)
    defer.returnValue(nextResult / 10)</code>

개발자는 "보내기" 기능의 목적과 기능을 이해함으로써 더 넓은 범위의 프로그래밍 시나리오에서 생성기의 잠재력을 활용할 수 있습니다.

위 내용은 Python의 `send` 기능은 어떻게 생성기와의 양방향 통신을 허용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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