在Python中,当print语句位于map函数内部时,它不会打印任何内容。

70
primes = [2,3,5,7..] (prime numbers)
map(lambda x:print(x),primes)
它没有打印任何东西。 为什么呢? 我试过

sys.stdout.write(x)

也是这样,但也没用。


4
这是Python 2中的语法错误,因此我会认为是Python 3。 - Greg Hewgill
4个回答

108

由于在 Python 3 中,lambda x: print(x) 是语法错误,因此我假设您使用的是 Python 3。这意味着map返回一个生成器,因此要让map实际上调用列表中每个元素上的函数,您需要遍历生成器。

幸运的是,这很容易实现:

list(map(lambda x:print(x),primes))

哦,如果你喜欢的话,也可以去掉 lambda:

list(map(print,primes))

但是,在那个时候,最好让print处理它:

print(*primes, sep='\n')

注意:我之前说过'\n'.join是个好主意,但只对字符串列表有效。


8
尽管如此,这仍然是一个非常糟糕的想法(非习语化,不明显 - 映射、过滤器、列表推导式等用于计算,而不是用于副作用)。你应该只使用for循环,或者print(*primes, sep ='\ n'),或print('\n'.join(str(x) for x in primes)) - user395760
1
@utdemir:在lambda或任何其他表达式中发生,它都可以(带或不带括号)。我认为OP的意思是这个,你只是想挑剔措辞而已 ;) - user395760
列表(map(lambda x:print(x) if x>=a and isIntPalindrome(x),primes)),为什么不起作用(语法)? - matiit
抱歉,我一直在我的代码中使用print语句,我刚刚尝试在Python 2.7和2.5中使用print("a"),所以认为这是有效的。感谢您的纠正。 - utdemir
1
如果您不想一次迭代所有的“primes”,或者由于其他原因您需要单独的“print”语句,那么Pythonic的方法是使用普通的“for”循环,而不是在“map”上使用“list”来累积“None”。如果出于某种原因需要使用“map”,则可以通过next((x for x in map(print, primes) if x != None), None)避免累积“None”,但没有理由这样做。 - agf
显示剩余2条评论

6
这对我很有效:
>>> from __future__ import print_function
>>> map(lambda x: print(x), primes)
2
3
5
7
17: [None, None, None, None]

您是否在使用 Python 2.x 版本,其中 print 是一个语句而不是一个函数?


3
它之所以起作用是因为你正在使用Python 2。在Python 3中,它不起作用。而且OP更有可能使用3.x,因为print被用作函数,并且由于sys.stdout.write“也不起作用”。 - user395760
1
你可以直接使用map(print, primes),而不需要定义一个lambda函数。 - hitzg

4

或者,您可以按照以下方式在 map(...) 前加上* 来展开它:

[*map(...)]

或者
{*map(...)}

请选择所需的输出格式,列表或字典。


1
谢谢,我已经离开Python很久了,但我认为那是一种优雅的方式。 - matiit

3

你看到这个问题的另一个原因可能是你没有评估map函数的结果。它返回一个生成器(可迭代对象)惰性地评估你的函数,而不是返回实际的列表。

primes = [2,3,5,7]
map(print, primes) # no output, because it returns a generator

primes = [2,3,5,7]
for i in map(print, primes):
    pass # prints 2,3,5,7

或者,您可以执行list(map(print, primes)),这也会强制对生成器进行求值,并在列表的每个成员上调用打印函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接