ホームページ  >  記事  >  バックエンド開発  >  Python のジェネレーターとイテレーターの簡単な紹介 (例付き)

Python のジェネレーターとイテレーターの簡単な紹介 (例付き)

不言
不言オリジナル
2018-09-27 14:53:592617ブラウズ

この記事では、Python のジェネレーターとイテレーターについて簡単に紹介します (例とともに)。これには一定の参考価値があります。必要な友人は参照できます。お役に立てば幸いです。

Iterator

Python では、オブジェクトをループ (トラバース) できる場合、オブジェクト内の各要素のプロセスを反復と呼びます。たとえば、辞書、文字列、リスト、タプル、セットなどです。これらを反復できる理由は、すべてに共通の組み込み関数 __iter__ があるためです。組み込みオブジェクトの __next__ 関数を実行すると、オブジェクトのすべての要素を順番に出力できます。たとえば、1 ~ 100 の値を格納するリストがありますが、最初の 50 要素だけを出力したいとします。

flag=True
l=[x for x in range(1,101)]
l_iter = l.__iter__()
while flag:
    try:
       item=l_iter.__next__()
       if item==51:
           flag=False
           break
       else:
           print(item)
    except:
        break

while ループでは、反復子は常にループして __next__() 関数を実行しますが、反復子自体は反復する必要がある要素の数を知りません。最後の要素が実行されると、引き続き __next__() 関数が実行されますが、この時点では反復できる要素がありません。反復子は反復できる要素を見つけることができないため、エラーが報告されます。そのため、while ループを使用する場合は、例外をキャッチするコード try else と併用することで、繰り返し処理中に例外が発生した場合、次のループが自動的に停止されます。

ジェネレーター:

要件があるとします。最初と 2 番目の要素を除き、他の要素は最初の 2 つの要素の合計です。

#こんな感じで書けます

def fib1(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b=b,a+b
        n=n+1
    return &#39;done&#39;

a=fib1(5)
print(a)

出力結果

1
1
2
3
5
done

導出過程は図の通りです

別のメソッドを使用します

def fib2(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
        n=n+1
    return &#39;done&#39;

この関数を呼び出します

a=fib2(5)
print(a)

出力結果

1 2b2a51d19d7c64a0eab3732f7e789d7c

今回定義した fib は単純な関数ではなく、ジェネレーターに変換されています。生成された結果を知りたい場合は、__next__ 関数を順番に実行できますが、毎回返される結果は 1 つだけであり、反復できる要素がなくなると例外がスローされます。

さらに、for ループと while (tryException と一緒に使用する必要があります) を使用して結果を出力することもできます。

 a=fib2(5)
 for c in a:
    print(c)

出力結果の表示 1 1 2 3 5.

ジェネレーターを使用する利点: ジェネレーターは、導出プロセスに基づいて次の要素を計算します。最初の 2 つの関数 fib1 と fib2 を見てみましょう。fib1 は、完全な計算結果を保存するためにコンピュータに固定メモリ領域を開きます。ただし、計算結果内の特定の要素にアクセスしたい場合は、計算全体を走査する必要があります。結果が最初です。オブジェクトの添え字や for ループや if 条件判断を使用して、必要な結果を得ることができます。これによりニーズは満たされますが、より多くのメモリ領域を消費します。 fib2 は推論プロセスに基づいて次の要素を計算するため、完全なオブジェクトを作成する前に必要な要素を取得できます。これにより、メモリ消費量が削減されます。

以上がPython のジェネレーターとイテレーターの簡単な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。