我想在lambda中使用print.像这样的东西:
lambda x: print x
Run Code Online (Sandbox Code Playgroud)
我明白,在Python 2.7中打印不是一个功能.所以,基本上,我的问题是:在Python 2.7中使用print作为函数是否有一种漂亮的方法?
the*_*eye 10
您可以导入print_function从__future__,并用它作为这样的功能
from __future__ import print_function
map(print, [1, 2, 3])
# 1
# 2
# 3
Run Code Online (Sandbox Code Playgroud)
问题是关于Python 2的,但是我最终还是从Google那里尝试使用Python 3的lambda内的print函数。
如果您只想查看有效的代码而不是我到达那里的方式,请跳至底部的最后一个代码示例。我想清楚地记录一下对于学习目的无效的内容。
假设您要定义一个lambda print_list来打印列表中的每个项目,并且之间要用换行符。
lst = [1, 2, 3]
print_list = lambda lst: ...
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
1
2
3
Run Code Online (Sandbox Code Playgroud)
并且不应有未使用的返回值。
首先,这里是行不通的Python 3井:
map(print, lst)
Run Code Online (Sandbox Code Playgroud)
但是,输出在某种程度上与直觉相反,并不是打印出来的行,因为Python 3中的map调用返回一个迭代器,而不是求值列表。
输出:
n/a
Run Code Online (Sandbox Code Playgroud)
返回值:
<map at 0x111b3a6a0>
Run Code Online (Sandbox Code Playgroud)
您可以通过将map结果传递到来实现打印list(...),这将产生理想的输出,但是具有返回空列表(在REPL中评估)的副作用。
list(map(print, lst))
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
Run Code Online (Sandbox Code Playgroud)
返回值:
[None, None, None]
Run Code Online (Sandbox Code Playgroud)
您可以使用下划线一次性变量约定来解决此问题:
_ = list(map(print, lst))
Run Code Online (Sandbox Code Playgroud)
一种类似的方法是在列表推导中调用print:
[print(i) for i in lst]
Run Code Online (Sandbox Code Playgroud)
我不喜欢这些方法,因为它们仍然产生未使用的返回值。
像这样:
[*map(print, [1, 2, 3])]
Run Code Online (Sandbox Code Playgroud)
(这仍然返回不理想的空值列表。)
在上面的注释中,@ thefourtheye建议使用单行循环:
for item in [1, 2, 3]: print(item)
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都可以正常工作,并且避免了副作用。尝试将其放入lambda会引发SyntaxError。我尝试将其包装在括号内,但没有成功;尽管可能有实现此目的的方法,但我还没有弄清楚。
我得到的答案是使用分隔符arg爆炸打印调用中的列表:
print(*lst, sep='\n')
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
Run Code Online (Sandbox Code Playgroud)
这将产生预期的结果而没有返回值。
最后,让我们将其包装在lambda中以根据需要使用:
print_list = lambda lst: print(*lst, sep='\n')
print_list([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
对于我在Python 3中的用例来说,这是最好的解决方案。
| 归档时间: |
|
| 查看次数: |
8193 次 |
| 最近记录: |