【问题标题】:Use print inside lambda在 lambda 中使用 print
【发布时间】:2014-04-07 13:40:53
【问题描述】:

我正在尝试在 lambda 中使用 print。类似的东西:

lambda x: print x

我明白,在 Python 2.7 中 print 不是一个函数。所以,基本上,我的问题是:在 Python 2.7 中是否有一种很好的方式来使用 print 作为函数?

【问题讨论】:

  • 您有答案告诉您如何将打印转换为函数,但是您是否有充分的理由不只编写函数而不是 lambda?然后你可以有多个陈述和一切。唯一的代价是你必须给函数一个名字。
  • @Duncan 因为就我而言,它更具可读性和更简单。例如: map (lambda x: print (x.encode()), sequence) 比定义一个函数然后映射它要好得多。
  • 但在这种情况下:for x in sequence: print(x.encode()) 会简单得多。为什么要把事情复杂化?有时lambda 非常有用,但不是为了那个。
  • @Duncan 好吧,事实上,他们是平等的。就我而言(我没有展示),我稍后也会使用编码值数组,map 返回。这有点奇怪,但口味不同;)

标签: python python-2.7


【解决方案1】:

您可以从__future__ 导入print_function 并将其用作这样的函数

from __future__ import print_function
map(print, [1, 2, 3])
# 1
# 2
# 3

【讨论】:

  • 废话,我使用 2.7,总是包含该导入,并且从未意识到现在可以采用这种方式...
  • 我知道问题是针对 Python 2 的,但我想在 Python 3 中做同样的事情。我认为 map 也可以,但我使用 3.6.0 得到的输出map(print, [1, 2, 3])<map at 0x10bfe3cf8>,它看起来像迭代器本身。任何想法?您的解决方案在 Python 2 中运行良好。
  • 看起来像这样包装 map 调用:[*map(print, [1,2,3])] 成功打印 3,但我更愿意只打印而不返回空值列表。
  • @TaylorEdmiston 现在想起来,这不是那么漂亮。您可能只想简单地做for item in [1, 2, 3]: print(item)
  • @thefourtheye 谢谢!对于我正在使用它的项目,我试图在 lambda 中定义这种行为。今天早上来找我的一个选项是在打印函数中使用 *args,如下所示:print(*lst, sep='\n')。我会将其添加为其他人的单独答案。
【解决方案2】:

如果您不想import from __future__,您可以让lambda 写入标准输出:

>>>import sys
>>>l = lambda x : sys.stdout.write(x)
>>>l('hi')
'hi'

【讨论】:

    【解决方案3】:

    这个问题是关于 Python 2 的,但我最终从 Google 来到这里,试图在 Python 3 的 lambda 中使用 print 函数。我正在为其他来这里的人添加这个答案。

    如果您只想查看有效的代码而不是我如何到达那里,请跳到底部的最后一个代码示例。我想清楚地记录什么对学习目的不起作用。

    想要的结果

    假设您要定义一个 lambda print_list,它打印列表中的每个项目,中间有一个换行符。

    lst = [1, 2, 3]
    
    print_list = lambda lst: ...
    

    想要的输出是:

    1
    2
    3
    

    并且应该没有未使用的返回值。

    尝试 1 - 地图不评估 Python 3 中的打印函数

    首先,以下是在 Python 3 中不能正常工作的

    map(print, lst)
    

    但是,输出有点违反直觉,不是打印的行,因为 Python 3 中的映射调用 returns an iterator 而不是评估列表。

    输出:

    n/a
    

    返回值:

    <map at 0x111b3a6a0>
    

    尝试 2 - 评估地图迭代器

    您可以通过将map 结果传递给list(...) 来实现打印,这会产生理想的输出,但具有返回空值列表的副作用(如在 REPL 中评估的那样)。

    list(map(print, lst))
    

    输出:

    1
    2
    3
    

    返回值:

    [None, None, None]
    

    您可以使用下划线 throwaway variable convention 解决此问题:

    _ = list(map(print, lst))
    

    类似的方法是在列表推导中调用 print:

    [print(i) for i in lst]
    

    我不喜欢这些方法,因为它们仍然会产生未使用的返回值。

    尝试 3 - 将解包运算符应用于映射迭代器

    像这样:

    [*map(print, [1, 2, 3])]
    

    (这仍然返回一个不理想的空值列表。)

    在上面的 cmets 中,@thefourtheye 建议使用单行 for 循环:

    for item in [1, 2, 3]: print(item)
    

    这适用于大多数情况并避免副作用。尝试将其放入 lambda 会引发 SyntaxError。我尝试将其包裹在括号中但没有成功;虽然可能有办法实现这一点,但我还没有弄清楚。

    (解决方案!)尝试 4 - 在 print 调用中应用解包运算符

    我得到的答案是使用分隔符 arg 在打印调用中分解列表:

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

    输出:

    1
    2
    3
    

    这会产生没有返回值的预期结果。

    最后,让我们将它封装在一个 lambda 中,以便根据需要使用:

    print_list = lambda lst: print(*lst, sep='\n')
    print_list([1, 2, 3])
    

    这是我在 Python 3 中的用例的最佳解决方案。

    相关问题

    【讨论】:

    • 在 Python 3 中,您应该简单地使用您的第四个解决方案,print(*lst, sep='\n')。这是最好的办法。
    【解决方案4】:

    我猜还有一个人们可能感兴趣的场景:“打印出 lambda 函数变量的中间步长值”

    例如,假设我想找出一个字符列表集合的字符集:

    In [5]: instances = [["C","O","c","1","c","c","c","c","c","1","O","C","C","N","C"],
       ...: ["C","C","O","C","(","=","O",")","C","C","(","=","O",")","c"],
       ...: ["C","N","1","C","C","N","(","C","c","2","c","c","c","(","N"],
       ...: ["C","l","c","1","c","c","c","2","c","(","N","C","C","C","["],
       ...: ["C","C","c","1","c","c","c","(","N","C","(","=","S",")","N"]]
    

    一种方法是使用reduce:

    def build_charset(instances):
        return list(functools.reduce((lambda x, y: set(y) | x), instances, set()))
    

    在这个函数中,reduce 接受一个带有两个变量x, ylambda 函数,一开始我以为它会像x -&gt; instancey -&gt; set()。但它的结果给出了一个不同的故事,所以我想即时打印它们的值。但是,lambda 函数只接受一个表达式,而 print 会引入另一个表达式。

    set(y) | x 的启发,我尝试了这个并且成功了:

    lambda x, y: print(x, y) or set(y) | x
    

    注意print()是NoneType,所以不能做andxor这些会改变原始值的操作。但or 在我的情况下工作得很好。

    希望这对那些也想了解手术过程的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2011-02-27
      • 2015-06-24
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多