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 중국어 웹사이트의 기타 관련 기사를 참조하세요!