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