替代3行类似java的代码?

eri*_*ork 1 python python-2.7

假设你有一个函数,有时会返回一个值,有时则不会,因为在这种情况下你真的没有什么东西可以返回,甚至没有默认值.现在你想对结果做些什么,但当然只有在有结果的时候.

例:

result = function_call(params)
if result:
    print result
Run Code Online (Sandbox Code Playgroud)

有没有办法以更加pythonic的方式写这个,甚至可能在一行?

像那样:

print function_call(params) or #nothing
Run Code Online (Sandbox Code Playgroud)

(注意,我的意思是它不应该打印"没有"或"无".它实际上根本就不打印,如果结果是None)

eca*_*mur 5

没有; 在Python中,名称绑定是一个语句,因此不能用作语句中的表达式.既然print也是一个声明,你将需要3行; 在Python 3中你可以写:

result = function_call(params)
print(result) if result else None
Run Code Online (Sandbox Code Playgroud)

这对于理解或生成器中的名称绑定来说并不完全正确,其中名称绑定是具有类似语句的语义的语法项:

[print(result) for result in generator_call(params) if result]
Run Code Online (Sandbox Code Playgroud)

正如科斯所说,你可以滥用它来创造一个单元素的理解:

[print(result) for result in (function_call(params), ) if result]
Run Code Online (Sandbox Code Playgroud)

执行名称绑定并且可能同样被滥用的另一个语法项是lambda表达式:

(lambda result: print(result) if result else None)(function_call(params))
Run Code Online (Sandbox Code Playgroud)

请注意,在这两种情况下,对返回值的操作必须是表达式而不是语句.