Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのジェネレーター?


ジェネレーターは、PEP 255で導入されて以来、Pythonの重要な部分となっています。

Pythonのジェネレーターは、ループの反復動作を制御するために使用できる特別なルーチンです。ジェネレータは、配列を返す関数に似ています。ジェネレーターにはパラメーターがあり、これを呼び出すことができ、一連の数値を生成します。ただし、配列全体を返す関数とは異なり、ジェネレーターは一度に1つの値を生成するため、必要なメモリは少なくなります。

キーワード「yield」を持つPython関数は、ジェネレーターと呼ばれることがあります。通常のPython関数は、最初の行から実行を開始し、returnステートメント、例外、または関数の終了を取得するまで続行しますが、関数スコープ中に作成されたローカル変数はすべて破棄され、それ以上アクセスできなくなります。ジェネレーターの場合、yieldキーワードが検出されると、関数の状態が凍結され、ジェネレーターが再度呼び出されるまで、すべての変数がメモリに保存されます。

イテレータに従ってジェネレータを使用することも、「next」キーワードを使用して明示的に呼び出すこともできます。

一般的にPythonのジェネレーター:

  • defキーワードで定義
  • yieldキーワードを使用する
  • 複数のyieldキーワードが含まれる場合があります。
  • イテレータを返します。

イテレータを備えたジェネレータ

def generator_thr_iter():
   yield 'xyz'
   yield 246
   yield 40.50
for i in generator_thr_iter():
   print(i)

出力

xyz
246
40.5

nextを使用するジェネレーター

def generator_thr_iter():
   yield 'xyz'
   yield 246
   yield 40.50
>>> g = generator_thr_iter()
>>> g.__next__()
'xyz'
>>> g.__next__()
246
>>> g.__next__()
40.5
>>> g.__next__()
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
g.__next__()
StopIteration
のファイル""、1行目

ジェネレーターは、一度に複数のアイテムを返すのではなく、1つずつ返すものと考えることができ、ジェネレーター機能は次のアイテムが要求されるまで一時停止されます。

1からnまでの数の平方を印刷するプログラム

1からnまでの数の2乗を計算したいとします。ここで、nは実際には大きな数であり、「n」までの数のリストを作成すると、システムメモリスペース全体を占有します。

ジェネレータがなければ、私たちのアプローチは次のようになります-

>>> n= 200000000000
>>> number_list = range(1, n+1)
>>> for i in number_list:
   print(i*i)

上記のアプローチは、多くのシステムメモリを消費します。より良いアプローチは、システムメモリが占​​有されないように、番号のリストを作成せずに番号を反復処理することです。ここにジェネレーターの使用があります。

同じためのジェネレータプログラムは-

def num_generator(n):
num =1
while True:
   yield num
   if num == n:
      return
   else:
      num += 1
for i in num_generator(200000000000):
   print (i*i)

したがって、上記のアプローチでは、forループが最初に初期化されると、num_generatorが呼び出され、n =200000000000の値がメモリに格納され、num =1が初期化され、永久にループするwhileループに入ります。次に、yield numが検出されます。このとき、whileループがフリーズし、すべてのローカル変数がメモリに格納されます。 num =1であるため、yield numはforループに返され、Iに割り当てられます。ここで、1(i * i)が出力され、num_generatorへの次の呼び出しが行われます。

これで、実行は以前にフリーズしたポイントから開始されるため、行num ==n(1 ==200000000000)が実行されます。これはfalseであるため、num +=1が実行されてnum=2になり、whileループは次のようになります。もう一度実行すると、プロセスが続行されます。

最後に、ループがn =20000000000まで実行され、200000000000が生成されると、次の行「num ==n」(200000000000 ==200000000000)が実行されます。これは、trueであるためreturnステートメントが実行されます。

したがって、ジェネレーターがreturnステートメントを実行するか、例外が発生するか、ジェネレーターの最後に到達すると、「StopIteration」例外が発生し、forループの反復がその時点で停止します。したがって、上記では、大規模なシステムメモリを占有する数の大きなリストを作成することなく、最大200000000000の数の平方を印刷できます。

上記のシナリオを考えてみましょう。毎日のプログラミングの練習でジェネレーターを使用して、より効率的なプログラムを作成できます。>


  1. JavaScriptジェネレーター

    ジェネレーター関数は、yieldキーワードを使用して結果を生成し、戻った後もその状態を維持します。これにより、次に呼び出されたときに、最後のyield実行からすぐに再開できます。ジェネレーター関数を呼び出すたびに、呼び出し元に値が返されます。 以下はJavaScriptのジェネレーター関数のコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport"

  2. Pythonのissuperset()

    この記事では、Pythonでのissuperset()と、さまざまな分野でのその実装について学習します。 このメソッドは、セットBのすべての要素に引数として渡されるすべての要素セットAが含まれている場合はブール値Trueを返し、Aのすべての要素がBに存在しない場合はfalseを返します。 これは、BがAのスーパーセットである場合、それを意味します returns true; else False 例 いくつかの例を見てみましょう A = {'t','u','t','o','r','i',