[解決済み] なぜnextは'StopIteration'を発生させるのに、'for'は通常のリターンを行うのでしょうか?
質問
このコードでは、なぜ
for
を使用しないため
StopIteration
または
for
ループはすべての例外をトラップして、静かに終了するのでしょうか?
その場合、なぜ余計な
return
?? それとも
raise StopIteration
によって引き起こされる。
return None
?
#!/usr/bin/python3.1
def countdown(n):
print("counting down")
while n >= 9:
yield n
n -= 1
return
for x in countdown(10):
print(x)
c = countdown(10)
next(c)
next(c)
next(c)
仮定の話
StopIteration
がトリガーされている。
return None
.
いつ
GeneratorExit
が生成されますか?
def countdown(n):
print("Counting down from %d" % n)
try:
while n > 0:
yield n
n = n - 1
except GeneratorExit:
print("Only made it to %d" % n)
を手動でやると。
c = countdown(10)
c.close() #generates GeneratorExit??
この場合、なぜトレースバックが表示されないのでしょうか?
解決方法は?
その
for
ループは
StopIteration
を明示的に指定します。
の目的は
for
文は、イテレータが提供するシーケンスをループするもので、例外はイテレータが終了したことを通知するために使用されます。
for
は、反復処理されているオブジェクトが発生させる他の例外をキャッチせず、この例外だけをキャッチします。
それは
StopIteration
は、反復処理をしている人に、これ以上生成するものがないことを伝えるための、通常、期待されるシグナルです。
ジェネレータ関数は、特殊なイテレータです。
StopIteration
は、関数が終了したとき(つまり、戻ったとき、だから、はい。
return None
レイズ
StopIteration
). これはイテレータの要件であり、イテレータは
しなければならない
上げる
StopIteration
を実行したときに、その結果を表示します。
StopIteration
が発生した場合、そこから別の要素を取得しようとすると (
next()
を呼び出すか、あるいは
.next()
(パイ2)または
.__next__()
(py 3) イテレータのメソッド)
が必要です。
常に
StopIteration
をもう一度。
GeneratorExit
での通信は例外です。
その他
の方向に移動します。あなたは、明示的に
終了
を持つジェネレータは
yield
式で、Pythonがそのクロージャをジェネレータに伝える方法は
GeneratorExit
その関数の内部で の内部で明示的に例外をキャッチします。
countdown
その目的は、ジェネレータが終了する際に、必要に応じてリソースをクリーンアップすることです。
A
GeneratorExit
は呼び出し元には伝搬されません。
generator.close()
ドキュメント
.
関連
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] と'is'のどちらかを使って文字列を比較すると、異なる結果になることがあるのはなぜですか?
-
[解決済み] なぜPythonのコードは関数の中でより速く実行されるのですか?
-
[解決済み] Pythonのtime.time()はローカルタイムスタンプとUTCタイムスタンプのどちらを返すのでしょうか?
-
[解決済み] なぜpythonはforやwhileループの後に'else'を使うのですか?
-
[解決済み] not(True) in [False, True]」はなぜFalseを返すのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
pythonを使ったオフィス自動化コード例
-
python string splicing.join()とsplitting.split()の説明
-
Python Decorator 練習問題
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python百行で韓服サークルの画像クロールを実現する
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】Python: OverflowError: 数学の範囲エラー