【问题标题】:Why doesn't print work in a lambda?为什么 print 在 lambda 中不起作用?
【发布时间】:2011-02-27 14:09:44
【问题描述】:

为什么这不起作用?

lambda: print "x"

这不是一个单一的陈述,还是别的什么? 关于 lambda 中允许的内容,文档似乎有点稀疏......

【问题讨论】:

  • docs.python.org/reference/expressions.html#lambda。它说“表达式”,它是所有可能表达式的完整定义的链接。这怎么“稀疏”?什么不正确或不完整?
  • @Lott 我误解了表达式/语句是什么以及 print 所属的位置。现在说得通了

标签: python printing lambda python-2.x


【解决方案1】:

lambda 的主体必须是单个表达式。在 Python 2.x 中,print 是一个语句。然而,在 Python 3 中,print 是一个 函数(函数应用程序是一个表达式,因此它可以在 lambda 中工作)。如果您使用的是最新的 Python 2.x,您可以(并且应该为了向前兼容 :) 使用向后移植的打印功能:

In [1324]: from __future__ import print_function

In [1325]: f = lambda x: print(x)

In [1326]: f("HI")
HI

【讨论】:

  • 现在我明白了为什么让它成为一个功能如此重要。想使用 print 作为默认的 kwarg 并修复它。谢谢。
  • 我可以知道为什么from __future__ import print_function 必须在代码的开头吗?谢谢
  • 我在哪里可以看到我们在这里写的打印件?
  • 我同意 Ben 的评论:我没有得到这个导入。 Python(2 或 3)有 print() 作为内置方法。
【解决方案2】:

如果我将它用于简单的存根,我会使用它:

fn = lambda x: sys.stdout.write(str(x) + "\n")

效果很好。

【讨论】:

  • 作为附加说明 - 使用上面的未来。仅在不可用的情况下使用它 - 这将是一个严重过时的版本。
【解决方案3】:

你写的相当于

def anon():
    return print "x"

这也会导致 SyntaxError,python 不允许您在 2.xx 中分配要打印的值;在python3中你可以说

lambda: print('hi')

它会起作用,因为他们已将 print 更改为函数而不是语句。

【讨论】:

  • 还有from __future__ import print_function,它在py2.x中启用了这个
  • 或者lambda: sys.stdout.write('hi')
  • @fmark:除了在 2.x 中没那么简单:您需要处理 sys.stdout.softspace 并(至少)在之后写一个换行符。
【解决方案4】:

lambda 的主体必须是一个返回值的表达式。 print,作为一个声明,不返回任何内容,甚至 None。同样,您不能将print 的结果分配给变量:

>>> x = print "hello"
  File "<stdin>", line 1
    x = print "hello"
            ^
SyntaxError: invalid syntax

您也不能将变量赋值放在 lambda 中,因为赋值是语句:

>>> lambda y: (x = y)
  File "<stdin>", line 1
    lambda y: (x = y)
                 ^
SyntaxError: invalid syntax

【讨论】:

    【解决方案5】:

    你可以这样做。

    创建一个函数将 print 语句转换为函数:

    def printf(text):
       print text
    

    并打印出来:

    lambda: printf("Testing")
    

    【讨论】:

    • 更灵活:def printf(fmt, *args): print(fmt % args)
    【解决方案6】:

    使用 Python 3.x,print 可以在 lambda 中工作,而无需更改 lambda 的语义。

    以特殊方式使用,这对于调试非常方便。 我发布了这个“迟到的答案”,因为这是我经常使用的实用技巧。

    假设您的“未检测” lambda 是:

    lambda: 4
    

    那么你的“仪表化” lambda 是:

    lambda: (print (3), 4) [1]
    

    【讨论】:

      【解决方案7】:

      lambda 的主体必须是单个表达式print 是一个声明,所以很遗憾,它已经发布了。

      【讨论】:

      • 谢谢,我不确定表达式与语句的定义,现在可以理解了
      【解决方案8】:

      Here,您会看到问题的答案。 print 不是 Python 中的表达式,它说。

      【讨论】:

      • 答案不完整,但链接很好。
      猜你喜欢
      • 2012-07-30
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 2021-10-07
      相关资源
      最近更新 更多