Python,为什么这个函数会进入无限循环

时间:2014-11-24 15:22:30

标签: python python-3.x

def new_if (pred,then_clause,else_clause):

    if pred:
        then_clause
    else:
        else_clause

def p(x):
    new_if(x>5,print(x),p(2*x))

p(1)

我认为一旦x达到8并且打印出8,该函数应该停止。

非常感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您的代码没有按照您的想法执行。

每次调用p时,它都会执行该方法中的代码,在这种情况下,您可以使用一些参数调用new_if。但是,您正在立即评估这些参数,这意味着在输入new_if之前,您的代码正在执行print(x)p(2*x)。这会导致p再次被调用,重复该过程。

答案 1 :(得分:2)

您认为代码的评估方式似乎存在一些普遍的混淆:特别是您认为谓词和子句实际上并非如此。在调用new_if之前,会对进行评估。因此,只要您致电p,就会通过评估p(2*x)来获得对p的无限递归调用。

您可以通过传递函数来实现您想要的功能,然后在new_if函数中进行评估。这可以通过lambda函数完成,如下所示:

def new_if (pred,then_clause,else_clause):
    if pred():
        then_clause()
    else:
        else_clause()

def p(x):
    new_if(lambda: x>5, lambda: print(x), lambda: p(2*x))

p(1)

在这种情况下,predthen_clauseelse_clause是您需要调用(())才能执行的callables。