pythonはreturnとyieldをどのように区別しますか

1.説明

リターンはいつもありますが、言語ごとに大きな違いはないので、これ以上は言いません。 (シェル言語の戻りは終了ステータスであり、その差は比較的大きい可能性があります。興味がある場合は、「Linuxシェル関数の定義と呼び出し」を参照してください)

歩留まりのスレッド優先度を調整するためにどの言語が使用されているかを最初に見ました。はっきりとは覚えていませんが、歩留まりはpythonの歩留まりとは異なるはずです。

pythonでyieldを初めて見たのは、スクレイプフレームワークを使用してクローラーを作成したときでした。以前にyiledの使用法も見ましたが、覚えていません。今日もまた見に行きましたが、基本的にはフィボナッチシーケンスのトラブルのいくつかを話し、自分でプログラムの一部を書いて勉強しました。メモです。

2つ目は、収益と利回りの類似点と相違点

共通点:returnとyieldは両方とも値を返すために使用されます; returnとyieldの役割は、すべての値を一度に返すシナリオで同じです。

違い:返されるデータがforなどのループによって生成されたイテレータータイプのデータ(リスト、タプルなど)である場合、returnはループの外側で一度だけ返され、yeildはループ内の要素ごとに返されます。以下に、この違いを例を挙げて説明します。

3.説明の例

3.1 返品バージョン

サンプルコードは次のとおりです。

classTestYield:
 def gen_iterator(self):
 result_list =[]for j inrange(3):print(f"gen_iterator-{j}")
 result_list.append(j)
 # returnはループの外側にあり、変数が完全に生成された後に1回戻ります
 return result_list

 def call_gen_iterator(self):
 # 次の文を実行した後、結果_リストは直接完成の結果です[0,1,2]
 result_list = self.gen_iterator()for i in result_list:print(f"call_gen_iterator-{i}")if __name__ =="__main__":
 obj =TestYield()
 obj.call_gen_iterator()

実行結果は次のとおりです。下位レベルの関数を一度に実行した後、完全なイテレータータイプの戻り値result_listが生成され、一度に上位レベルの関数に返されることがわかります。

3.2 イールドバージョン

サンプルコードは次のとおりです。

classTestYield:
 def gen_iterator(self):for j inrange(3):print(f"do_something-{j}")
 # 歩留まりはforループ内にあります
 yield j

 def call_gen_iterator(self):
 # 利回りは直接のリターンではありません[0,1,2]、次の文の結果を実行した後_リストには価値がありません
 result_list = self.gen_iterator()
 # i Genは、データが要求されるたびにトリガーされます_iteratorはデータを生成します
 for i in result_list:print(f"call_gen_iterator-{i}")if __name__ =="__main__":
 obj =TestYield()
 obj.call_gen_iterator()

実行結果は次のとおりです。上位関数と下位関数が交互になっていることがわかります。つまり、下位関数が値を生成してすぐにこの値を返す前に、上位関数が値の反復を要求します。

3.3 歩留まりの意味

上記の2つのサブセクションからわかるように、returnとyieldの実行順序は異なりますが、実行するすべてのことは同じであるため、yieldの使用はreturnよりも速くはなく、yieldは常にコンテキストで発生するため推測できます。切り替えの速度は遅くなるため、速度は歩留まりの意味ではありません。

それらの主な違いは、yiledはどの要素に対して反復する必要があり、その要素は即座に生成されるのに対し、returnは中間変数result_listを使用して戻り値を保存することです。result_listの長さが非常に長く、各構成要素の内容が大きい場合、コストが高くなります。現時点では、歩留まりは収益よりも有利です。

4、yieldとreturnのネストされた使用

classTestYield:
 def gen_iterator(self):for j inrange(3):print(f"do_something-{j}")
 # 歩留まりはforループ内にあります
 yield j

 def gen_iterator_middle(self):print(f"gen_iterator_middle")
 # リターンはイテレーターのハンドルであるため、リターンのレイヤーを追加しても影響がないことは理解できます。
 return self.gen_iterator()

 def call_gen_iterator(self):
 # 利回りは直接のリターンではありません[0,1,2]、次の文の結果を実行した後_リストには価値がありません
 result_list = self.gen_iterator_middle()
 # i Genは、データが要求されるたびにトリガーされます_iteratorはデータを生成します
 for i in result_list:print(f"call_gen_iterator-{i}")if __name__ =="__main__":
 obj =TestYield()
 obj.call_gen_iterator()

上記は、pythonがreturnとyieldを区別する方法の詳細な内容です。pythonreturnとyieldの詳細については、179885.Comの他の関連記事に従ってください。

https://www.179885.com/python/433122.html

Recommended Posts

pythonはreturnとyieldをどのように区別しますか
Pythonはどのように整数を出力しますか
pythonはどのようにバックスラッシュを出力しますか
pythonはパッケージをどのように更新しますか
pythonはどのようにマトリックス操作を実行しますか
Pythonはどのように更新値を一覧表示しますか
pythonはどのように環境を変えますか
pythonはjavaクラスをどのように呼び出しますか
pythonは依存関係パッケージをどのようにインポートしますか
pythonはどのようにインタラクティブモードに入りますか
Pythonはどのようにxmlファイルを生成しますか
pythonでreturnを書く方法
pythonはどのように素数を決定しますか
およびおよびまたはPythonでの使用方法
pythonはどのように計算速度を向上させますか
pythonはどのように独自の関数を呼び出すのですか
Pythonはjsonモジュールをどのように処理しますか
CentOs7はMBRとGRUBをどのように修正しますか?
PythonはOSモジュールを使用してcmdを呼び出す方法
Python and Go
pythonでファイルとディレクトリを削除する方法
Pythonでファイルを読み書きする方法
Pythonはどのようにデータをjsonファイルに保存しますか
pythonはどのように辞書のキーを呼び出しますか
pythonはプログラムをどのように処理しますか開くことができません
pythonはモジュールのインストールが完了したとどのように判断しますか
Pythonの内省と考察
[python] ubuntuの下のpython2とpython3
Pythonの分解とパッケージ化
pythonがどのように発明されたか
Python3の構成とentry.md
PythonがXMLを解析する方法
自分でpythonを学ぶのにどれくらい時間がかかりますか?