6

yield from からの戻り値の例を見つけることができませんでした。この単純なコードを試しましたが、成功しませんでした:

def return4():
    return 4


def yield_from():
    res = yield from range(4)
    res = yield from return4()


def test_yield_from():
    for x in yield_from():
        print(x)


test_yield_from()

生成するもの:

» python test.py 
0
1
2
3
Traceback (most recent call last):
  File "test.py", line 52, in <module>
    test_yield_from()
  File "test.py", line 48, in test_yield_from
    for x in yield_from():
  File "test.py", line 44, in yield_from
    res = yield from return4()
TypeError: 'int' object is not iterable

しかし、私は期待していました:

» python test.py 
0
1
2
3
4

なぜなら、PEP で述べられているように:

さらに、反復子が別のジェネレーターの場合、サブジェネレーターは値を指定して return ステートメントを実行でき、その値が yield from 式の値になります。

明らかに、私はこの説明を受けていません。return「サブジェネレーター」のa は、 に関してどのように機能しyield fromますか?

4

3 に答える 3

9

ジェネレーターは、使い果たされたときに値を返すことができます。

def my_gen():
    yield 0
    return "done"

g = my_gen()
next(g)
next(g) # raises StopIteration: "done"

yield fromステートメントで返される値はこの値になります。例えば。

def yield_from():
    res = yield from my_gen()
    assert res == "done"

デフォルトでは、この値はNoneです。つまり、 としてres = yield from range(4)設定さresNoneます。

于 2015-10-09T10:42:59.443 に答える
2

yield from generatorの略です

for i in generator:
    yield i

それよりも少し複雑です: https://www.python.org/dev/peps/pep-0380/#formal-semantics .

の場合、これはうまく機能しませんgenerator = 4。(あなたreturn4()ジェネレーターではありません。それは関数です。)

欲しいものを手に入れるには、次のようにします。

def yield_from():
    yield from range(4)
    yield 4
于 2015-10-09T10:28:52.413 に答える
1

テストの実際の例を投稿しています。

return4 関数がジェネレーターになりました。これを実現するには、yield が関数内のどこかに存在する必要があります (Python 3.5 には新しい関連機能がありますが、それは今は重要ではありません)。

あなたがすでに引用したように:

さらに、イテレーターが別のジェネレーターの場合、サブジェネレーターは値を指定して return ステートメントを実行でき、その値が yield from 式の値になります。

要約: 値が得られます。たとえば、次のように印刷できます。

def yield_from():
    # ...
    val = yield from return4()
    print("value:", val)  # prints value: 4

しかし、印刷するのではなく、それを生成したいのです。完全なコードは次のとおりです。

def return4():
    if False:
        yield None
    return 4

def yield_from():
    yield from range(4)
    yield (yield from return4())

def test_yield_from():
    for x in yield_from():
        print(x)

test_yield_from()
# prints numbers 0 to 4

あなたはおそらく、それが何に役立つのかを自問しているでしょう. ジェネレーターから値を受け取るだけの場合、ほとんど利点はありません。ただしyield from、値をジェネレーターに送信する場合は優れた機能です。Python コルーチンの適切な説明を見つけてみてください。すごい。

于 2015-10-09T15:10:37.740 に答える