>  기사  >  백엔드 개발  >  Python 생성기에서 \"send\" 함수의 실제 목적은 무엇이며, \"yield\" 키워드와 어떻게 다릅니까?

Python 생성기에서 \"send\" 함수의 실제 목적은 무엇이며, \"yield\" 키워드와 어떻게 다릅니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-02 11:46:30489검색

What is the true purpose of the

생성기의 "send" 함수 목적에 대한 빛 차단

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

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