2016-11-14 38 views
7

TLDR:我們可以在lambda內實現yield或生成器語句(帶循環)嗎?python:lambda,yield-statement/expression和loops(澄清)

我的問題是澄清:

無論下面簡單的循環功能,可以用產量來實現在錯誤

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 

看起來像,它期待不成文的返回語句的右操作數,但發現yeild並感到困惑。

有沒有一個合適的方法來實現循環?

旁註:yield可取決於誰你問的語句/表達:yield - statement or expression?

最終的答案:產量可與拉姆達使用,但限制(單線),使之無用。 for/while在lambda中不可能,因爲它們不是表達式。 -user2357112隱式for循環對於列表理解是可能的,並且yield在列表理解中是有效的。 - WIM

Verdict-顯式循環不可能的,因爲在Python lambda表達式只能包含表達式,並寫一個明確的循環中,您將需要使用的語句。 -wim

+1

「但你也可以使用如下語句打印'()'只要它被包含在一個單一的線」 - 錯了! 'print'是Python 3中的函數,'print'調用是普通表達式。你不能在'yield'調用中使用任意的單行語句。 – user2357112

+5

試圖用'lambda'寫這個是毫無意義的。如果你想把它填入一行,'(x for x in range(0,15))'將是你的生成函數的直接genexp轉換。 – user2357112

+0

我同意。我試圖測試一個理論。第二個想法是,由於'lambda'必須適合單個語句的限制,我懷疑我可以在'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

是的。就像有人指出的那樣,它基本上是一個生成器obj。你知道是否可以用'for' /'while'來完成。另外,你不能用lambda單行做任何事情。 – theMobDog

+5

請注意,Python 2的結果完全不同。這段代碼實際上取決於Python 3的實際情況,列表理解是由'lambda'創建的匿名函數內的* another *匿名函數實現的。 – user2357112