函数式python编程与条件语句

2024-06-26 14:06:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用函数的方式编写一个python函数。问题是,我不知道如何将if条件转换为函数样式。我有两个变量:AC,我想检查以下条件:

def function():
    if(A==0): return 0
    elif(C!=0): return 0
    elif(A > 4): return 0
    else: someOtherFunction()

我看了看lambda shortcircuiting,但是我不能让它工作。在

我提前感谢你的帮助!在


Tags: lambda函数returnifdef方式function样式
3条回答

在您当前的代码中没有任何非“功能性样式”!谁说条件句是有功能的?实际上,所有函数式语言都有某种条件运算符,例如Lisp中的cond特殊形式。在

如果代码使用赋值运算符,或者以某种方式改变状态(比如,附加到列表中),我会对代码提出异议,但事实上,问题中的函数已经是“函数式”了——没有状态更改。在

也许你的意思是这样的?在

return A != 0 and C == 0 and A <= 4 and someOtherFunction()

如果A == 0或{}或{},则上面的函数将返回False,在所有其他情况下,它将返回调用someOtherFunction()的值。顺便说一句,False可以假设为0(例如,42 + False == 42),因此问题中的代码中的语义将从调用者的角度得到保留。在

请注意,您将链接中的信息与上下文无关。完全不需要使用lambda,本文只解释如何在Python中绕过lambdas的固有限制,即不能在内部返回语句(如if-elif-else)——只允许使用表达式,但可以使用布尔运算符来伪造它们。在正常函数的上下文中,一定要使用条件句。在

虽然彼得·诺维格是一个非常伟大的人,但他的网站很难搜索。在

我记得有段时间我在他的网站上读到了关于Can I do the equivalent of (test ? result : alternative) in Python?的文章,那是在一次函数式Python演讲之前进行的一些研究。在

我不打算根据我的发现左右你,但你还是应该去读一下关于函数式三元条件运算符的章节。在

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

link you posted

FP either discourages or outright disallows statements, and instead works with the evaluation of expressions

因此,您可以使用conditional expression代替if-语句:

def function():
    return (0 if ((A == 0) or (C != 0) or (A > 4)) else
            someOtherFunction())

或者,(如果存在许多不同的值,尤其有用):

^{pr2}$

顺便说一句,连载文章提出

(<cond1> and func1()) or (<cond2> and func2()) or (func3())

相当于

if <cond1>:   func1()
elif <cond2>: func2()
else:         func3()

问题是它们不对等!当<cond1>为Truish而func1()为Falsish(例如False0或{})时,布尔表达式无法返回正确的值。(或者类似地当<cond2>是真的而func2是假的时候。)

(<cond1> and func1())

编写的目的是在<cond1>为真时求值为func1(),但当{}为Falsish时,(<cond1> and func1())计算结果为{},因此整个表达式被传递,Python继续计算(<cond2> and func2()),而不是短路。在

这里有一段有趣的历史。2005年, Raymond Hettinger foundz = (0+4j)时,type(z)==types.ComplexType and z.real or z中有一个类似的很难找到的bug,因为z.real是错误的。出于将我们从类似错误中拯救出来的愿望,使用a less error-prone syntax(条件表达式)的想法诞生了。在

相关问题 更多 >