ホームページ >バックエンド開発 >Python チュートリアル >Python での yield の使用方法の詳細な説明

Python での yield の使用方法の詳細な説明

高洛峰
高洛峰オリジナル
2017-03-17 16:57:082669ブラウズ

yield は単に generator です。ジェネレーターは、最後に返されたときの関数本体内の位置を記憶する function です。ジェネレーター関数への 2 番目 (または n 番目) の呼び出しは、関数の途中にジャンプし、前の呼び出しからのすべてのローカル 変数 は変更されないままになります。

ジェネレーターは関数です

関数のすべてのパラメータは保持されます

この関数が2回目に呼び出されるとき

使用されたパラメータは前回から保持されます

ジェネレータもそれを「記憶」しますフロー制御

ジェネレーターの構築は、そのデータ 状態を「記憶」するだけではありません。 ジェネレーターは、フロー制御構造内の位置も「記憶」します (命令型プログラミングでは、この構造は単なるデータ値ではありません)。継続性は、(ジェネレーターと同様に) 常に直接の呼び出し元のコンテキストに戻ることなく、実行フレーム間を任意にジャンプできるため、依然として比較的一般的です。

yieldジェネレーターの動作メカニズム

ジェネレーターに数値を要求すると、ジェネレーターはyieldステートメントが表示されるまで実行され、その後ジェネレーターは実行を継続しません。 次の数字を尋ねると、彼は最後の状態から実行を開始し、yield ステートメントが表示されるまで実行し、パラメータを指定して停止します。関数が終了するまでこれを繰り返します。

例: Python 順列、組み合わせジェネレーター

#完全な順列を生成

def perm(items, n=None):
    if n is None:
        n = len(items)
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[:i] + items[i+1:]
            for p in perm(rest, n-1):
                yield v + p

#組み合わせを生成

def comb(items, n=None):
    if n is None:
        n = len(items)    
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[i+1:]
            for c in comb(rest, n-1):
                yield v + c
 
a = perm('abc')
for b in a:
    print b
    break
print '-'*20
for b in a:
    print b

結果は次のとおりです:

102 pvopf006 ~/test> ./generator.py

abc

- -------------------

acb

bac

bca

cab

cba

最初のループの中断後に、ジェネレーターが継続的な実行はなく、最初のループの後に 2 番目のループが実行されます

以上がPython での yield の使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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