【问题标题】:Print doesn't print when it's in map, Python打印在地图中时不打印,Python
【发布时间】:2011-12-05 13:59:54
【问题描述】:
primes = [2,3,5,7..] (prime numbers)
map(lambda x:print(x),primes)

它不打印任何东西。 这是为什么? 我试过了

sys.stdout.write(x)

也是,但也不起作用。

【问题讨论】:

  • 这是 Python 2 中的语法错误,所以我假设是 Python 3。

标签: python-3.x dictionary


【解决方案1】:

由于lambda x: print(x) 是 Python map 返回一个生成器,这意味着要让 map 实际调用列表的每个元素上的函数,你需要遍历生成的生成器。

幸运的是,这很容易做到:

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

哦,如果你愿意,你也可以去掉 lambda:

list(map(print,primes))

但是,此时你最好让 print 处理它:

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

注意:我之前说过'\n'.join 是个好主意。这仅适用于 str 列表。

【讨论】:

  • 这仍然是一个非常糟糕的主意(非惯用的,不明显的 - 映射、过滤器、列表推导等是用于计算,而不是用于副作用)。您应该只使用 for 循环、print(*primes, sep='\n')print('\n'.join(str(x) for x in primes))
  • print(x) 不是 Python
  • @utdemir:出现在 lambda 或任何其他表达式中,它是(带或不带括号)。我认为 OP 的意思是,你只是想在措辞上挑剔;)
  • list(map(lambda x:print(x) if x>=a and isIntPalindrome(x),primes)) 好的,但是为什么这不起作用(语法)
  • 如果您不想一次遍历所有 primes,或者出于其他原因您想要单独的 print 语句,Pythonic 方式是普通的 for 循环,而不是list 上的 map 累积了 Nones。如果你因为某种原因需要使用map,你可以避免Nonenext((x for x in map(print, primes) if x != None), None)的积累,但是没有理由这样做。
【解决方案2】:

这对我有用:

>>> from __future__ import print_function
>>> map(lambda x: print(x), primes)
2
3
5
7
17: [None, None, None, None]

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

【讨论】:

  • 它特别有效,因为您使用的是 Python 2。在 Python 3 中,它没有。并且 OP 更有可能使用 3.x,因为 print 被用作函数并且因为 sys.stdout.write “也不起作用”。
  • 其实你可以直接做map(print, primes),不用定义lambda函数。
【解决方案3】:

或者,您可以通过将* 放在map(...) 之前来解压,如下所示

[*map(...)]

{*map(...)}

选择您想要的输出,列表或字典。

【讨论】:

  • 谢谢,我早已远离 python,但恕我直言,这是一种优雅的方式。
【解决方案4】:

您可能会看到这种情况的另一个原因是您没有评估 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)),这也将强制对生成器进行评估并在列表的每个成员上调用打印函数。

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 2021-12-01
    • 2016-12-03
    • 1970-01-01
    • 2017-08-10
    • 2015-03-10
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多