Python ジェネレーターの Send 関数
このチュートリアルでは、Python でジェネレーターの send()
関数を使用する方法を説明します。
ジェネレーターの概要
Python ジェネレーター関数を介して、イテレーターのように機能し、for
ループで使用できる関数を作成できます。 たとえば、最初の n
個の非負の整数を表す first_n()
というメソッドのさまざまな実装を比較します。
n
は巨大な数であるため、この比較を行うには、各整数に多くのストレージ スペースが必要であると想定します。たとえば、それぞれ 10
メガバイトとしましょう。
巨大な整数でない限り、実生活ではあまりスペースを占有しないことに注意してください。 したがって、たとえば、128 バイトを使用して 309 桁の整数を表すことができます。
次の例を考えてみましょう。
def first_n(n):
num, nums = 0, []
while num < n:
nums.append(num)
num += 1
return nums
sum_of_first_n = sum(first_n(1000000))
上記のコードは、最初の n
個までの値を合計する合計関数を作成します。 唯一の問題は、大量のメモリを構築することです。
覚えておいてほしいのは、メモリーに最大 10
メガバイトの整数を保持する余裕はないということです。 それを解決するために、Python のジェネレーターを利用します。
ジェネレーターは、イテレーターの作成に役立ちます。 次のコードブロックで理解できます。
def first_n(n):
num, nums = 0, []
while num < n:
yield num
num += 1
return nums
print(sum(first_n(1000000)))
出力:
499999500000
上記のコード フェンスは、イテレータ実行のメモリ ユース ケース機能を使用します。
Python ジェネレーターで send()
を使用する
ジェネレーター イテレーターの send()
メソッドは、ジェネレーターに役立ちます。 Python バージョン 2.5 以降、PEP 342
で指定されているこの関数にアクセスできるようになりました。
ジェネレーターは send()
メソッドで再起動されます。このメソッドは、後続の yield を開始するために使用される値も送信します。 最後に、プロセス (メソッド) は、ジェネレーターによって生成された新しい値を返します。
send()
メソッドは、値がない場合に next()
を使用するのと似ています。 None
は、このプロシージャの別の可能な値です。 どちらの状況でも、ジェネレーターはその操作を最初の return
ステートメントに転送します。
次のコードで send()
関数を調べてみましょう。
def numberGenerator(n):
number = yield
while number < n:
yield number
number += 1
g = numberGenerator(10)
next(g)
print(g.send(5))
出力:
5
上記のコード ブロックでわかるように、最後の行で、値 5
を g
変数内に送信し、ジェネレーターが最後の入力を 5
と見なすようにします。
send()
関数は、最後の入力として使用できるジェネレーター変数に、最後の許容値を送信します。 これで、ジェネレーターの仕組みとジェネレーターの send()
関数の重要性が理解できました。