【问题标题】:Python: Lambda Inside Print FunctionPython:Lambda 内部打印函数
【发布时间】:2015-03-08 14:18:09
【问题描述】:

有很多与 lambda 和打印相关的问题,但我找不到关于这个确切问题的任何信息。

我想在打印语句中打印我的 lambda 函数的结果。但是,我得到了错误的输出。我正在使用 Python 3

from __future__ import print_function
file_name = "tester"
target = "blue"
prediction = "red"

print(file_name,target,prediction, str(lambda x: print('+') if target==prediction else print('-')))

这会返回:

tester blue red <function <lambda> at 0x10918c2f0>

如何得到 lambda 函数的实际结果?

【问题讨论】:

  • 不需要 lambda,只需 print(file_name,target,prediction,'+' if target == prediction else '-')
  • 拥有 lambda 有什么意义?为什么直接使用 inline if 呢?
  • 如果你使用的是python 3.x,那你为什么要from __future__ import print_function

标签: python python-3.x lambda


【解决方案1】:

lambdas 实际上只是函数。所以,除非你调用它们,否则你不会从它们那里得到任何结果。当你这样做时

str(lambda x: print('+') if target==prediction else print('-'))

您实际上并没有调用lambda 函数,而是试图获取函数本身的字符串表示形式。如您所见,字符串表示包含有关对象是什么以及它在内存中存储位置的信息。

<function <lambda> at 0x10918c2f0>

除此之外,lambda 中的另一个问题是,您实际上是在其中调用 print 函数。它实际上会打印结果但返回None。因此,即使您调用 lambda 表达式,也会打印出 None。例如,

>>> print(print("1"))
1
None

但是,好消息是,就您而言,您根本不需要 lamda

print(file_name, target, prediction, '+' if target == prediction else '-')

表达式,

'+' if target == prediction else '-'

称为conditional expression,如果target 等于prediction,则确保您将获得+,否则为-

>>> file_name, target, prediction = "tester", "blue", "red"
>>> print(file_name, target, prediction, '+' if target == prediction else '-')
tester blue red -

注意:如果您使用的是 Python 3.x,则无需从 __future__ 导入 print_function。它已经是一个函数,在 Python 3.x 中。

Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> type(print)
<class 'builtin_function_or_method'>

【讨论】:

  • Python 太棒了。谢谢
  • 我实际上选择了接受另一个答案,即使这更简单。另一个答案确实更适合整体问题。
【解决方案2】:

只需调用 lambda

print(file_name,target,prediction, (lambda: '+' if target==prediction else '-')())

【讨论】:

  • 谢谢!这其实是一个更合适的答案
  • 这实际上是一个非常糟糕的答案;您的 lambda 所做的只是浪费周期并使代码比例如更难阅读。 print(file_name,target,prediction, '+' if target==prediction else '-')
  • 你能澄清一下吗?好像更合适……?
  • 在这个例子中 lambda 不是必需的,但你可以使用它,你也可以使用 u"{}{}{}".format(fillename, target, predoction),这是 pep 解决方案。
猜你喜欢
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2022-01-23
  • 2023-02-03
相关资源
最近更新 更多