(本体に yield ステートメントがあるもの)を単に呼び出すとgenerator function
、ジェネレーター オブジェクトが取得されます。その時点で関数の実行が開始されることさえありません。返されたジェネレーター オブジェクトの反復処理を開始したときにのみ開始されます (または、それを呼び出しますnext()
)。例 -
>>> def gen1():
... print("Starting")
... for i in range(10):
... yield i
...
>>> g = gen1()
>>> g
<generator object gen1 at 0x00273E68>
上記のように、関数の実行は開始されず、ジェネレーター オブジェクトが返されただけです。関数を通過するには、反復処理g
または呼び出しが必要next()
です。例 -
>>> g.next()
Starting
0
>>> for i in g:
... print i
...
1
2
.
.
最初のケースでも同様のことが起こっています。ジェネレーターオブジェクトを返すジェネレーター関数を呼び出してから、結果を破棄しています。ほとんどの場合、rst()
が呼び出された場所から、ジェネレーター オブジェクトが返されることを期待しています。その場合、2 番目の方法が最適です。
しかし、本当に別の関数で作成したい場合 (別のメソッドで作成する必要はないと思います) は、self.wait_clks(5)
back fromの結果を直接返すことができますrst(self)
。例 -
def rst(self):
rst.next=reset.active
return self.wait_clks(5)
これが機能することを示す例 -
>>> def f():
... return gen1()
...
>>> for i in f():
... print(i)
...
Starting
0
1
2
.
.