在lambda中使用print

时间:2014-03-05 13:10:51

标签: python python-2.7

我正在尝试在lambda中使用print。这样的事情:

lambda x: print x

据我所知,在Python 2.7中,print不是一个函数。所以,基本上,我的问题是:在Python 2.7中是否有一种使用print作为函数的漂亮方法?

4 个答案:

答案 0 :(得分:9)

您可以从print_function导入__future__并将其用作此类函数

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

答案 1 :(得分:6)

问题是关于Python 2,但我最终在这里试图在Python 3中使用lambda中的print函数。我为这些来到这里的其他人添加了这个上下文的答案。 / p>

如果您只想查看有效的代码,而不是我到达那里的方式,请跳到底部的最后一个代码示例。我想清楚地记录出用于学习目的的内容。

期望的结果

假设您要定义一个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中评估)。 / p>

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])]

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

在上面的评论中,@ thefourtheye建议使用一行for循环:

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

这适用于大多数情况并避免副作用。试图将它放在lambda中会抛出一个SyntaxError。我试着将它包裹在parens中但没有成功;虽然可能有办法实现这一目标,但我还没有想到它。

(解决方案!)尝试4 - 在打印调用中应用解包操作符

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

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

输出:

1
2
3

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

最后,让我们将它包装成lambda以根据需要使用:

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

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

相关问题

答案 2 :(得分:3)

如果您不想import from __future__,只需将lambda写入标准输出:

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

答案 3 :(得分:0)

我想人们可能会对另外一种情况感兴趣:“打印出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带有两个变量lambda的{​​{1}}函数,起初我以为是x, y和{{1} }。但是其结果给出了一个不同的故事,因此我想即时显示其价值。 x -> instance函数只使用一个表达式,而打印将引入另一个表达式。

y -> set()的启发,我尝试了此方法,它的工作原理是:

lambda

请注意,set(y) | x的类型为NoneType,因此无法进行lambda x, y: print(x, y) or set(y) | x print()这些会改变原始值的操作。但是and在我的情况下效果很好。

希望这对那些也想看看手术过程中发生了什么的人很有帮助。