2016-11-14 3 views
7

TLDR:lambda内にyieldまたはジェネレータ文(ループ付き)を実装できますか?Python:lambda、yield文/式とループ(明確化)

私の質問を明らかにすることである。

次の簡単なループ機能が降伏エラーで

def loopyield(): 
    for x in range(0,15): 
     yield x 
print(*loopyield()) 

結果を用いて実施することができるかどうかを指定します。

lamyield=lambda x: yield x for x in range(0,15) 
        ^
SyntaxError: invalid syntax 

それは期待していた、のように見えます書かれていないreturnステートメントのための右のオペランドとして何かがありますが、yeildが見つかり、混乱しています。

ループ内でこれを達成する適切な方法がありますか?

サイドノート

yieldは、あなたが尋ねる人に応じた声明/発現することができます: yield - statement or expression?

最終的な答え:収率はラムダと一緒に使用することができますが、制限(シングルライン)は、それは無用になります。 for/whileは式ではないため、ラムダでは使用できません。 -user2357112暗黙のforループはリスト内包表記で可能であり、yieldはリスト内包表記内で有効です。 - WIM

Verdict-明示的なループではない可能性Pythonでラムダは式のみを含めることができ、あなたはステートメントを使用する必要があります明示的なループを記述するため。 -wim

+1

「あなたも限りそれは、単一の行に含まれているとして ')('プリントのようなステートメントを使用することができます」 - 間違っています! 'print'はPython 3の関数で、' print'呼び出しは普通の式です。 'yield'呼び出しの中で任意の単一行の文を使用することはできません。 – user2357112

+5

これを 'lambda 'で書くのは無意味です。それを一行にまとめる場合、 '(x in x in range(0、15))'はジェネレータ関数の直接genexp変換になります。 – user2357112

+0

私は同意します。私は理論を試そうとしていた。 2番目の考えでは、 'lambda'の制限が1つのステートメントに収まらなければならないので、' lambda 'の中にループを持つために何かを達成することはできません。しかし、それは私を悩ませているので、最終的にこれを明確にすることは良いでしょう。 – theMobDog

答えて

7

作成しようとしているように見えるワンライナーは、実際に技術的に可能ラムダであり、あなただけもう少しパーサを支援する必要があります。

>>> lamyield = lambda: [(yield x) for x in range(15)] 
>>> print(*lamyield()) 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 

これは、forループの使用暗黙のうちにリスト内包である。明示的なwhileループまたはforループは理解できません。これは、Pythonのlambdasにはexpressionsしか含まれていないため、明示的なループを書くにはstatementsを使用する必要があるからです。

Note: this syntax is deprecated in Python 3.7, and will raise SyntaxError in Python 3.8

+0

うん。誰かが指摘したように、基本的にジェネレータオブジェクトです。それが 'for' /' while'でできるかどうか知っていますか?また、ラムダの1行では何もできません。 – theMobDog

+5

結果はPython 2では全く異なっていることに注意してください。このコードは、Python 3ではリストの理解度が 'lambda 'によって作成された匿名関数の中の*別の*匿名関数で実装されているという事実にとても微妙に依存します。 – user2357112