【问题标题】:Unexpected output for lambda python 3lambda python 3的意外输出
【发布时间】:2018-11-10 13:17:41
【问题描述】:

我正在尝试将 lambda 用于用例,但它似乎不起作用。以下是我尝试过的

下面是我使用的,在stackflow中我遇到很多人为此获得输出,但对我来说它没有

from __future__ import print_function
f = lambda x: print(x)
f()
f("Hello") ### now out put is shown expected is Hello output
f("Hello") is None ## I checked if its None and it is
>>> True 

然后我尝试了其他方法

l = lambda x : sys.stdout.write(x)
l('hello') # this time its showing output as 5 instead of printing hello
>>> 5

我什至尝试了一些不使用 lambda 的东西,不幸的是,它也不起作用,结果没有

from functools import partial
spam = partial(print, 'Hello!')
spam()
spam() is None
>>> True

我从这个问题的最后一个答案assigning print function to variable得到这个

谁能帮助我我缺少什么以及为什么我无法打印字符串?

【问题讨论】:

  • 这真是太棒了!
  • 使用 Python3 l('hello') 在我的系统上输出 hello 并返回 5。使用 python2 我只得到没有整数返回值的 hello 输出。
  • 请考虑详细说明您正在使用的环境。另外,如果你只是写一个简单的print("Hello"),它是否正确显示?
  • @tevemadar 是的 print("Hello") 打印 Hello。我在 jupyter notebook 里面使用
  • 您是否可能以某种方式抑制错误消息?如果我将第一个 sn-p 放入单个单元格,则空的 f() 调用会在本地和 jupyter.org/try 上为我引发 TypeError。然后其余的行不会运行,但默认情况下错误消息非常明显。您是否尝试过重新启动内核?根据您的屏幕截图,您处于第 59-60 个输入,谁知道之前发生了。

标签: python lambda stdout


【解决方案1】:

什么不是预期的? f('Hello') is None 评估为 True?这是意料之中的,因为它是None

lambda x: print(x) 没有'return',只有一个副作用,副作用是将东西打印到输出。这类似于一个函数

def func(x): 
    print(x)

它没有返回语句,因此,如果你评估这个函数,它的输出将是None

【讨论】:

  • @Rocky Li,这是关于当你调用l = lambda x : sys.stdout.write(x) 然后像l('hello') 这样调用它时它返回hello5 而只是hello
  • 它不是打印输出。假设我输入 f("Hello") 它什么也不打印。在其他情况下 l('hello') 打印字符数而不是字符串
  • @pygo: l('hello') 打印hello(如果刷新)并返回5,因为sys.stdout.write 返回写入的字符数,请参阅docs.python.org/3/library/io.html#io.TextIOBase.write
  • @pygo 你是怎么得到 hello5 的?我刚得到 5
  • @pygo 哈哈,这很时髦。现在我得到了像你一样的东西,带有 hello5。在 shell 中尝试时
【解决方案2】:
l = lambda x : sys.stdout.write(x)
l('hello') # this time its showing output as 5 instead of printing hello
>>> 5

可能是因为write没有刷新,你可以手动调用强制这样做

sys.stdout.flush()

至于为什么它返回hello5是因为Python shell打印出上一条语句的返回值,sys.stdout.write()返回写入字符的计数,在'hello'的情况下为5。因此它们被连接起来进入hello5。如果你在一个普通的 Python 文件中运行它,即python filename.py,它永远不会打印5,而只会打印hello

【讨论】:

  • 但是如何只打印“Hello”而不是字符数?
  • 您的代码在 Python 解释器 REPL 之外应该可以正常工作(将其放在单独的文件中并尝试)
  • @UkuLoskit 我把它放在一个 python 文件中,它仍然返回 number.l = lambda x : sys.stdout.write(x); sys.stdout.flush()。 l(hello).. 返回 5
  • @UkuLoskit,虽然听起来很有趣,但您在解释器之外,同时保存在文件中,然后按预期工作并且不返回数字!
  • @gboffi,谢谢,我也意识到了这一点,我的错误:)
猜你喜欢
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
相关资源
最近更新 更多