まずは普通のyieldの簡単な使いかたです。
>>> def g():
yield 0
yield 1
return
>>> a = g()
>>> next(a)
0
>>> next(a)
1
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
こんな風にするとラムダ式でも yield できます。
>>> g = lambda : (
(yield 0)
, (yield 1)
)
>>> a = g()
>>> next(a)
0
>>> next(a)
1
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration: (None, None)
yield from
も使えます。
>>> g = lambda : (yield from [0,1])
>>> a = g()
>>> next(a)
0
>>> next(a)
1
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
ループは使えないので再帰などを使って工夫する必要があります。カウンタの例。
>>> count = lambda n : (
(yield n)
, (yield from count(n+1))
)
>>> a = count(1)
>>> next(a)
1
>>> next(a)
2
>>> next(a)
3
>>> next(a)
4
いたずらに変わった書き方をする必要はありませんが、主に他言語との連携、他言語からの類推でラムダ式をもっと有効に使いたいという潜在需要はあると思います。自己責任でお使いください。