2010-06-04 71 views
135

爲什麼不能正常工作?爲什麼不在lambda打印工作?

lambda: print "x" 

這是不是一個單一的陳述,還是別的什麼? 該文件似乎對什麼是允許的拉姆達有點稀疏......

+1

http://docs.python.org/reference/expressions.html#lambda 。它說「表達」,這是所有可能的表達的完整定義的鏈接。這是如何「稀疏」?什麼不正確或不完整? – 2010-06-04 02:49:02

+3

@洛特我對於表達/陳述是什麼以及印刷品屬於哪裏有誤解。現在有意義 – Anycorn 2010-06-04 05:31:06

回答

164

一個lambda「身體必須是單個表達。在Python 2.x中,print是一個聲明。然而,在Python 3中,print函數(並且函數應用程序是一個表達式,所以它將在lambda中運行)。你可以(而且應該,向前兼容:)如果你使用的是最新的Python 2.x的使用後移植打印功能:

In [1324]: from __future__ import print_function 

In [1325]: f = lambda x: print(x) 

In [1326]: f("HI") 
HI 
+5

現在我明白了爲什麼它是一個很重要的功能。想要使用打印作爲默認kwarg,並修復它。謝謝。 – 2012-07-03 07:30:16

23

你寫的是相當於

def anon(): 
    return print "x" 

這也導致一個SyntaxError,蟒蛇不會讓您指定在2.xx中打印的值;在python3中,你可以說

lambda: print('hi') 

它會工作,因爲他們已經將print改爲函數而不是語句。

+3

還有'from __future__ import print_function',它可以在py2.x中啓用此功能。 – tzaman 2010-06-04 01:10:21

+5

或者'lambda:sys.stdout.write('hi')' – fmark 2010-06-04 01:24:26

+0

@fmark:除了2中不那麼簡單。 x:你需要處理sys.stdout.softspace,並且(至少)之後寫一個換行符。 – 2011-05-25 13:42:49

3

lambda的主體必須是單個表達式print是一個聲明,所以不幸的是,它已經結束。

+0

謝謝,我不確定表達與聲明的定義,現在有意義 – Anycorn 2010-06-04 01:06:55

11

lambda的主體必須是一個返回值的表達式。 print作爲聲明,不會返回任何內容,甚至不會返回None。同樣,你不能的print結果賦值給一個變量:

>>> x = print "hello" 
    File "<stdin>", line 1 
    x = print "hello" 
      ^
SyntaxError: invalid syntax 

你也不能把一個變量賦值在一個lambda,因爲分配是語句:

>>> lambda y: (x = y) 
    File "<stdin>", line 1 
    lambda y: (x = y) 
       ^
SyntaxError: invalid syntax 
2

Here,你看你的問題的答案。它說,print不是Python中的表達式。

+1

不完整的答案,但不錯的鏈接。 – Stephen 2010-06-04 01:42:31

22

在情況下,我用這簡單的磕碰出我使用這個:

fn = lambda x: sys.stdout.write(str(x) + "\n") 

它完美的作品。

+3

作爲補充說明 - 使用上面的未來版本。只有在沒有可用的情況下才能使用它 - 現在這將嚴重過時。 – 2015-04-04 20:53:47

8

你可以這樣做。

創建一個函數來打印語句轉換成一個功能:

def printf(text): 
    print text 

和打印:

lambda: printf("Testing") 
1

使用Python 3.x中,打印可以在拉姆達工作,而不改變lambda的語義。

以特殊的方式使用,這對於調試非常方便。 我發表這篇'遲到答案',因爲這是我經常使用的一種實用技巧。

假設你的 '配備工具' 拉姆達:

lambda: 4 

那麼你的 '儀器' 拉姆達是:

lambda: (print (3), 4) [1]