我正在尝试在lambda中使用print。这样的事情:
lambda x: print x
据我所知,在Python 2.7中,print不是一个函数。所以,基本上,我的问题是:在Python 2.7中是否有一种使用print作为函数的漂亮方法?
答案 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
并且应该没有未使用的返回值。
首先,在Python 3中,无法正常工作
map(print, lst)
但是,输出有点违反直觉而不是打印行,因为Python 3 returns an iterator中的地图调用而不是评估列表。
输出:
n/a
返回值:
<map at 0x111b3a6a0>
您可以通过将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]
我不喜欢这些方法,因为它们都会产生未使用的返回值。
像这样:
[*map(print, [1, 2, 3])]
(这仍然会返回一个非理想的空值列表。)
在上面的评论中,@ thefourtheye建议使用一行for循环:
for item in [1, 2, 3]: print(item)
这适用于大多数情况并避免副作用。试图将它放在lambda中会抛出一个SyntaxError。我试着将它包裹在parens中但没有成功;虽然可能有办法实现这一目标,但我还没有想到它。
我得到的答案是使用分隔符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
在我的情况下效果很好。
希望这对那些也想看看手术过程中发生了什么的人很有帮助。