Python での yield の使い方の紹介 (コード付き)

不言
リリース: 2019-02-22 14:49:11
転載
1906 人が閲覧しました

この記事では、WeChat アプレット Python での yield の使用法 (コード付き) を紹介します。これには一定の参考価値があります。必要な友人は参照できます。お役に立てれば幸いです。

まず、利回りについて予備知識がないと、まず利回りを「リターン」と考えてしまうでしょう。これは直感的です。まずはリターンです。通常のリターンとは何を意味しますか? ? プログラム内で特定の値が返され、復帰後はプログラムが実行されなくなります。それを return として見た後、それをジェネレーターの一部として考えてください (yield を含む関数が実際のイテレータです)。これらを理解していない場合は、最初に yield を return として扱ってください。次に、次のプログラムを直接見てください。そうすれば、yield の完全な意味が理解できます:

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))
ログイン後にコピー

ほんの数行のコードで、yield が何であるかを理解できます。コードの出力は次のとおりです:

starting...
4
********************
res: None
4
ログイン後にコピー

Iコードの実行シーケンスを直接説明します。これは、コードのシングルステップ デバッグと同等です:

1. プログラムの実行が開始された後、foo 関数に yield キーワードがあるため、foo 関数は実際には実行しません。代わりに、最初にジェネレーター g (オブジェクトに相当) を取得します。

2. 次のメソッドが呼び出されるまで、foo 関数が正式に実行を開始します。最初に foo 関数内の print メソッドを実行し、次に while ループに入ります

3. プログラムは yield キーワードに遭遇し、yield を return とみなします。4 を返した後、プログラムは停止し、res 操作への代入は実行されません。このとき、 next(g) ステートメントの実行が完了したので、出力の最初の部分です。 2 行 (1 行目は 上記の print の結果、2 行目は return の結果) は、print(next() の実行結果です。 g)),

4. プログラムは print(""20) を実行し、出力 20 *

5. 次の print(next(g)) の実行を開始します今回は上記と似ていますが、違うのは今回は先ほどから開始することです 停止したところから次のプログラムの実行が開始されます、つまり res の代入操作が行われることになります。今回は、この時点では代入演算の右側に値がないことに注意してください(戻り値が出たばかりで、代入演算の左側には値がありません。パラメータを渡します)。この時点では、 res 割り当ては None なので、次の出力は res:None,

6 です。プログラムはしばらく実行を続け、再び yield に遭遇します。このとき、 4 も返します。その後、プログラムが停止し、print 関数による 4 出力が、この return による 4 出力になります。

この時点で、yield と return の関係と違いが理解できると思います。yield を持つ関数はジェネレーターです。関数ではありません。このジェネレータには next 関数という関数があります。next は「次のステップ」で生成される番号に相当します。今回の next の開始点は、前回の next が停止した場所から実行されるため、呼び出し時にnext の場合、ジェネレーターは foo 関数の先頭から実行されず、前のステップが停止したところから開始され、yield に遭遇した後、生成される数値を返し、このステップは終了します。

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(g.send(7))
ログイン後にコピー

このジェネレーターの送信関数の別の例を見てみましょう。この例は、上の例の最後の行を置き換えるもので、出力結果は次のようになります:

starting...
4
********************
res: 7
4
ログイン後にコピー

送信について簡単に説明します。概念: このとき、上の紫色の文字と、なぜ上の res の値が None で、これが 7 になるのかに注目してください。これは、send が res にパラメータを送信するためです。戻ったとき、res には 4 は代入されません。次に実行されるときは、引き続き代入操作を実行する必要があり、値を None に代入する必要があります。send が使用されている場合、実行が開始されると、最初の状態から継続されます。前回(return 4 After)の実行は、まずresに7を代入し、次にnextの関数を実行し、次のyieldを満たし、結果を返して終了します。

5. プログラムは g.send(7) を実行し、プログラムは yield キーワード行から下方向に実行を続け、send は値 7 を res 変数

6 に割り当てます。 send メソッドには next() メソッドが含まれているため、プログラムは下方向に実行を続けて print メソッドを実行し、再び while ループに入ります (

7)。プログラムの実行で yield キーワードが再び検出された後、 、yield は後続の値を返し、次のメソッドまたは send メソッドが再度呼び出されるまでプログラムは再び一時停止します。

以上です。このジェネレーターを使用する理由について話しましょう。List を使用すると、より多くのスペースが必要になるためです。たとえば、0,1,2,3,4,5,6 を例に挙げます。 ......1000

次のようになります:

for n in range(1000):
    a=n
ログイン後にコピー

現時点では、range(1000) はデフォルトで 1000 個の数値を含むリストを生成します。そのため、多くのメモリを消費します。

現時点では、先ほどの収量の組み合わせを使用して実装用のジェネレーターを形成することも、xrange(1000) ジェネレーターを使用して

収量の組み合わせ:

def foo(num):
    print("starting...")
    while num<10:
        num=num+1
        yield num
for n in foo(0):
    print(n)
ログイン後にコピー
を実装することもできます。

出力:

starting...
1
2
3
4
5
6
7
8
9
10
ログイン後にコピー

xrange(1000):

for n in xrange(1000):
    a=n
ログイン後にコピー

python3 には xrange() がないことに注意してください。python3 では、range() は xrange() です。 python3 を使用できます。 の range() の型を確認してください。これはすでにリストではなく になっています。結局のところ、これは最適化する必要があります。

以上がPython での yield の使い方の紹介 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!