为什么map(print,a_list)不起作用?

时间:2012-08-01 21:51:16

标签: python python-2.7 map-function

对于正常功能,map效果很好:

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

python会抱怨:

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

是什么让print特别? print(x)也不是有效的函数调用吗?上面的代码在python 2.7下进行了测试。

6 个答案:

答案 0 :(得分: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,因此您将使用只有值{{1}的相同长度列表替换值列表}。

编辑: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/

答案 1 :(得分:8)

在2.x中映射打印的更好方法是

from __future__ import print_function

答案 2 :(得分:4)

正如其他人所说,在Python 2.x中print是一个声明。如果您真的想在Python 2.x中执行此操作,可以使用pprint

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

答案 3 :(得分:1)

从您的第print l行开始,我认为这是python2,其中print 不是一个函数,它是一个声明。

答案 4 :(得分:1)

因为print不是函数。

但是你可以制作打印包装器,当然:

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

答案 5 :(得分:0)

上述答案适用于Python 2,但在Python 3中不适用于map和print函数的更改。

我在Python 3中实现我想要的map(print, lst)做的解决方案是解压缩打印调用中的列表。

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

输出:

1
2
3

您可以在我对Use print inside lambda的回答中找到更多详细信息。