对于正常功能,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下进行了测试。
答案 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
。
答案 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的回答中找到更多详细信息。