2012-08-01 92 views
17

對於一個正常的功能,map效果很好:爲什麼地圖(打印,a_list)不起作用?

def increment(n): 
    return n+1 
l = [1, 2, 3, 4, 5] 
l = map(increment, l) 
print l 
>>> [2, 3, 4, 5, 6] 

但是,如果它是print陸續投放map函數內部:

l = [1, 2, 3, 4, 5] 
l = map(print, l) 
print l 

蟒蛇會抱怨:

l = map(print, l) 
      ^
SyntaxError: invalid syntax 

是什麼讓print特別? print(x)是否也是一個有效的函數調用?上面的代碼是在python 2.7下測試的。

回答

21

在Python 2.x中,print是一個語句,而不是函數。如果你在Python 3.x中使用它,它將起作用。

在Python 2.x中,你可以說print(x),它不是一個語法錯誤,但它實際上並不是一個函數調用。就像1 + (3)1 + 3一樣,print(x)與Python 2.x中的print x相同。

在Python 2.x中,你可以這樣做:

def prn(x): 
    print x 

然後,你可以這樣做:

map(prn, lst) 

,它會工作。請注意,您可能不想執行lst = map(prn, lst),因爲prn()返回None,因此您將用值爲None的同一長度列表替換值列表。

編輯:另外兩個Python 2.x版本的解決方案。

如果你想徹底改變print的行爲,你可以這樣做:

from __future__ import print_function 

map(print, lst) 

這使得print成一個函數只是因爲它是在Python 3.x中,所以它與map()工作。

或者,你可以這樣做:

from pprint import pprint 

map(pprint, lst) 

pprint()是打印的東西的功能,它可以作爲一個內置。我不確定它與默認的print有什麼不同(它說這是一個「漂亮的打印」功能,但我不確定它是如何使它不同)。

此外,根據PEP 8標準,不建議使用l作爲變量名,所以我在我的示例中使用了lst

http://www.python.org/dev/peps/pep-0008/

+0

它不會爆炸,但很可能它不會按預期工作。我想clwen想要真正地打印東西,而不是'<地圖對象在0x9a62aec>'。如果你想打印它,你必須迭代地圖對象。 – 2013-11-07 18:44:58

+0

我不確定你的意思是「它不會炸燬」......如果你在Python 2.x中運行'map(print,[])',你會得到'SyntaxError:invalid syntax',因爲'print '是一個聲明。你必須在Python 3.x中試過它,其中'print'是一個函數,將它傳遞給'map()'是完全合法的。在Python 2.x中'map()'返回一個列表,而不是''。 – steveha 2013-11-07 20:27:52

+0

我的意思是說,你是對的,'map(print,[])'不會在Python 3中爆炸(拋出一個異常)。但是儘管它沒有拋出異常,但結果可能並不是clwen想要的要得到。 – 2013-11-07 21:57:46

1

從您的線路print l,我想這是python2,其中print的功能,這是一個聲明。

4

正如其他人所說,在Python 2.x print是一個聲明。如果你真的想這樣做在Python 2.x中,你可以使用pprint

from pprint import pprint 
l = [1, 2, 3, 4, 5] 
p = map(pprint, l) 
1

因爲print不是一個函數。

但是你可以進行打印,包裝,當然:

>>> def p(x): 
... print x 
... 
>>> l = [1, 2, 3, 4, 5] 
>>> l = map(p, l) 
1 
2 
3 
4 
5 
8

一種更好的方式來映射在2.X印刷是做

from __future__ import print_function 
+1

如果你這樣做,你不能再使用'print'作爲該模塊中的語句。只要這是理解這是一個合理的事情。 – steveha 2012-08-01 22:52:03

0

以上答案爲Python 2工作,但不是在Python 3中對map和print函數進行更改。

爲了達到我想要的map(print, lst)在Python 3中完成的解決方案,是在打印調用中解壓列表。

lst = [1, 2, 3] 
print(*lst, sep='\n') 

輸出:

1 
2 
3 

你可以找到解決這個在我的答案更詳細地Use print inside lambda

相關問題