[解決済み] リターンとイールドを同一機能で表現
質問
Pythonでyieldとreturnが同じ関数で使われた場合、具体的にどのようなことが起こるのでしょうか?
def find_all(a_str, sub):
start = 0
while True:
start = a_str.find(sub, start)
if start == -1: return
yield start
start += len(sub) # use start += 1 to find overlapping matches
やはり発電機なのでしょうか?
どのように解決するのですか?
はい、やはり発電機です。その
return
を上げるのと(ほぼ)同じです。
StopIteration
.
PEP 255 はそれを綴っています。
<ブロッククオート仕様です。戻る
ジェネレータ関数は、returnステートメントを含むことができます。
"return"
のreturnステートメントではexpression_listは許されないことに注意してください。 はジェネレータ本体の return 文では許されないことに注意してください。 の本体には現れるかもしれませんが)。
returnステートメントに遭遇した場合、制御はあらゆる 関数のreturnと同様に制御が進み、適切なfinally節があればそれを実行します。 を実行します。) その後、StopIteration例外が発生し、イテレータが使い果たされたことを通知します。 イテレータが使い果たされたことを示します。 StopIteration例外は、以下の場合にも発生します。 制御が明示的な戻り値なしにジェネレータの終端から流れた場合にもStopIteration例外が発生します。
returnは、ジェネレータ関数と非ジェネレータ関数の両方において、"もう終わり、何も面白いものはありません。 ジェネレータ関数と非ジェネレータ関数の両方において、returnは"を意味することに注意してください。
returnは常にStopIterationを発生させることと同じではないことに注意してください。 その違いは、try/except 構成をどのように扱うかにあります。 扱われるかにあります。例えば
>>> def f1():
... try:
... return
... except:
... yield 1
>>> print list(f1())
[]
なぜなら、どんな関数でもそうですが、returnは単に終了するだけですが
>>> def f2():
... try:
... raise StopIteration
... except:
... yield 42
>>> print list(f2())
[42]
StopIterationは、他の例外と同様に、素の"except"によって捕捉されるからです。 例外です。
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] 文字列リテラルの前にある'b'文字は何を意味するのでしょうか?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
-
[解決済み] Python: ジェネレータ式とyieldの比較