def if_(test, result, alternative=None):
"If test is true, 'do' result, else alternative. 'Do' means call if callable."
if test:
if callable(result): result = result()
return result
else:
if callable(alternative): alternative = alternative()
return alternative
在您当前的代码中没有任何非“功能性样式”!谁说条件句是有功能的?实际上,所有函数式语言都有某种条件运算符,例如Lisp中的
cond
特殊形式。在如果代码使用赋值运算符,或者以某种方式改变状态(比如,附加到列表中),我会对代码提出异议,但事实上,问题中的函数已经是“函数式”了——没有状态更改。在
也许你的意思是这样的?在
如果}或{},则上面的函数将返回
A == 0
或{False
,在所有其他情况下,它将返回调用someOtherFunction()
的值。顺便说一句,False
可以假设为0
(例如,42 + False == 42
),因此问题中的代码中的语义将从调用者的角度得到保留。在请注意,您将链接中的信息与上下文无关。完全不需要使用
lambda
,本文只解释如何在Python中绕过lambda
s的固有限制,即不能在内部返回语句(如if-elif-else
)——只允许使用表达式,但可以使用布尔运算符来伪造它们。在正常函数的上下文中,一定要使用条件句。在虽然彼得·诺维格是一个非常伟大的人,但他的网站很难搜索。在
我记得有段时间我在他的网站上读到了关于Can I do the equivalent of (test ? result : alternative) in Python?的文章,那是在一次函数式Python演讲之前进行的一些研究。在
我不打算根据我的发现左右你,但你还是应该去读一下关于函数式三元条件运算符的章节。在
从link you posted:
因此,您可以使用conditional expression代替
if
-语句:或者,(如果存在许多不同的值,尤其有用):
^{pr2}$顺便说一句,连载文章提出
相当于
问题是它们不对等!当})时,布尔表达式无法返回正确的值。(或者类似地当
<cond1>
为Truish而func1()
为Falsish(例如False
或0
或{<cond2>
是真的而func2
是假的时候。)编写的目的是在}为Falsish时,},因此整个表达式被传递,Python继续计算
<cond1>
为真时求值为func1()
,但当{(<cond1> and func1())
计算结果为{(<cond2> and func2())
,而不是短路。在这里有一段有趣的历史。2005年, Raymond Hettinger found当
z = (0+4j)
时,type(z)==types.ComplexType and z.real or z
中有一个类似的很难找到的bug,因为z.real
是错误的。出于将我们从类似错误中拯救出来的愿望,使用a less error-prone syntax(条件表达式)的想法诞生了。在相关问题 更多 >
编程相关推荐