tag

#interpreter

13 pages tagged

35. 発電機

#35. 発電機 ジェネレーターは再開可能な関数です。通常の関数は、開始、実行、および 1 つの戻り値で終了します。ジェネレーターは、開始して値を生成し、フレームを一時停止し、後で同じ命令位置から再開して別の値を生成し、終了するまで繰り返すことができます。 ジェネレーター関数は、以下を含む関数本体です。 yield 。 python id="j7t4va" def numbers(): yield 1 yield 2 yield 3 この関数を呼び出しても、本体はすぐには実行されません。 python id="oyb9ik" g = numbers() この呼び出しによりジェネレーター オブジェクトが作成されます。ジェネレーターが再開されると本体が開始されます。 python id="9sgmxp" print(next(g)) print(next(g)) print(next(g)) 出力: text id="wj3i3f" 1 2 3 最後の値の後、次の再開で値が発生します StopIteration 。 35.1 ジェネレータ関数とジェネレータ オブジェクト ジェネレーター関数は、次のように定義された呼び出し可能関数です。 def 。 ジェネレーター オブジェクトは、ジェネレーター関数が呼び出されたときに返される再開可能なイテレーターです。```python id="nckwxg" def gen(): yield 1 print(gen) print(gen()) 概念的には: text id="hfh6hz" gen function object gen() generator object suspended execution state code object frame…

27. 評価ループ

#27. 評価ループ 評価ループは、CPython の中心的な実行エンジンです。コンパイルされたコード オブジェクトを取得し、そのバイトコード命令を実行して、結果または例外を生成します。 大まかに言うと、CPython の実行は次のようになります。```text Python source ↓ tokens ↓ parser ↓ AST ↓ symbol table ↓ compiler ↓ code object ↓ frame ↓ evaluation loop ↓ Python result or exception 評価ループは CPython のインタプリタ実装内に存在します。歴史的に、キー ファイルは ` Python / ceval . c ` 、周囲のインタプリタ機構が他のファイルに分散されています。最新の CPython は、バイトコード定義からいくつかのインタープリター コードも生成します。詳細はリリース間で変化しますが、モデルは安定しています。フレームはバイトコード命令を繰り返しディスパッチすることでコード オブジェクトを実行します。このコードはバージョン間で変更されるため、 CPython 独自の開発者ガイドでは、現在の参照として内部ドキュメントとソース ツリーを示しています。 ## 27.1 評価ループの仕事 評価ループは Python テキストを解析しません。 AST は構築されません。通常、語彙の範囲は決定されません。これらのジョブは、実行が開始されるまでにすでに終了しています。 その仕事はより狭く、より機械的です。 ``` text read the next bytecode instruction decode its…