プロが教える店舗&オフィスのセキュリティ対策術

このプログラムの動きが知りたいです


range(10)を渡して
for element in iterable:で加算していく
yieldで戻り値を返す

ここがよくわかりません
print(gen)をするとリストみたいに値ではなく generator object なんたらかんたらと表示されます


def accumulate_generator(iterable):
 current = 0
 for element in iterable:
  current += element
   yield current

gen = accumulate_generator(range(10))
print(gen)
for e in gen: print(e)

A 回答 (2件)

pythonの話ですよね。



yield を含む関数はgenerator functionといって
その呼び出しは関数の中味を実行するのではなく
generatorオブジェクトを返します。

generator はiteratorの一種で
__next__() メソッドを持ち
next関数で呼びだすことが出来ます。

最初の__next__メソッドの呼び出しでは
generator は最初のyield式まで実行し
yieldの引数の値を返します。

次回の__next__メソッドの呼び出しでは
generatorはyield式のところから実行を再開
次のyield式まで実行しyield式の引数の値を返します。

あなたの書いたgeneratorでは

next(gen) → 0を返す。
next(gen)→ 1を返す。
next(gen)→ 3を返す。
:
:
next(gen) → 45を返す。
next(gen) → Stopiteration例外発生

という動きになります。

for e in genは
next(gen)の戻りをeに代入し
Stopiteration例外が起きるまでループを回してくれます。

このような、呼び出しの途中で実行を中断、再開するような
処理の形態をコルーチンと言います。
メジャーな言語ではC#もサポートしてますが
珍しい言語機能です。

pythonでは多用されています。

また、asyncioパッケージではコルーチンで
強調型マルチタスク処理を実現しています。
pythonの言語機能のひとつの大きな柱といえます。
    • good
    • 0
この回答へのお礼

ありがとうございます
処理を止めて読み出すってことですね

お礼日時:2019/09/27 09:31

生成するってことでしょう

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!