Python 생성기 영역에서는 Yield 키워드가 초석이 되어 다음을 생성할 수 있습니다. 반복 가능한 시퀀스. 그러나 Yield와 함께 또 다른 수수께끼의 함수인 send가 숨어 있습니다.
문서에는 send가 "실행을 재개하고 생성기 함수에 값을 "전송"합니다"라는 비밀스러운 설명이 나와 있습니다. 이는 그 목적과 수익률과의 관계에 대해 의문을 제기합니다.
가치는 입력이자 출력인가요?
첫 번째 당혹감은 가치가 입력 역할을 한다는 개념에서 발생합니다. 생성기 기능에. 그러나 문서에서는 send가 생성기가 생성한 다음 값을 반환한다고 제안합니다. 이것은 Yield가 수행하는 것과 동일한 기능이 아닐까요?
진짜 목적 밝히기
이 수수께끼를 해결하는 열쇠는 send를 사용하면 값을 주입하는 동시에 값을 주입할 수 있다는 점을 이해하는 데 있습니다. 발전기가 양보하고 있습니다. 다음 예를 고려하십시오.
<code class="python">def double_inputs(): while True: x = yield yield x * 2</code>
이 생성기를 두 개의 구멍이 있는 블랙 박스로 상상해 보십시오. 하나는 값을 수신하기 위한 구멍(수율)이고 다른 하나는 값을 반환하기 위한 구멍(수율)입니다. 생성기를 시작하기 위해 next(generator)를 호출하면 입력을 기다리면서 첫 번째 항복 문에서 일시 중지됩니다.
이제 send를 사용하여 생성기에 값을 공급할 수 있습니다. 값은 임시로 x 변수에 저장됩니다. 생성기를 다시 시작하면 첫 번째 Yield 문 이후의 코드가 실행되어 입력 값을 효과적으로 두 배로 늘리고 Yield를 통해 반환합니다.
수율이 없는 예
시연하려면 Yield로는 달성할 수 없는 send의 고유한 기능을 고려하려면 다음을 고려하세요.
<code class="python">gen = double_inputs() next(gen) # run up to the first yield gen.send(10) # goes into 'x' variable</code>
이 코드는 생성기에 값 10을 효과적으로 주입합니다. 그런 다음 실행을 재개하고 두 배의 값인 20을 반환합니다. 이러한 일련의 작업은 Yield만으로는 달성할 수 없습니다.
send를 사용한 Twisted의 마법
send의 실제 적용 사례 중 하나는 Twisted의 @defer.inlineCallbacks 데코레이터입니다. 이를 통해 미래 값을 나타내는 Deferred 객체를 생성하는 함수를 작성할 수 있습니다. 기본 프레임워크는 이러한 지연된 객체를 가로채서 백그라운드에서 필요한 계산을 실행합니다.
계산이 완료되면 프레임워크는 결과를 생성기로 다시 전송하여 실행 재개를 시뮬레이션하고 생성기가 후속 작업을 진행할 수 있도록 합니다. 운영.
결론
Python 생성기의 send 함수를 사용하면 항복 문에서 일시 중지된 생성기에 값을 삽입할 수 있습니다. 이 기능은 Twisted의 @defer.inlineCallbacks 데코레이터에서 보여주듯이 정교한 제어 흐름을 가능하게 하고 비동기 프로그래밍을 단순화할 수 있습니다. Yield와 함께 보내기의 고유한 목적을 이해하면 Python 코드에서 생성기의 잠재력을 최대한 활용할 수 있습니다.
위 내용은 Python 생성기에서 \'send\' 함수의 실제 목적은 무엇이며, \'yield\' 키워드와 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!