使用if语句

时间:2017-07-02 14:29:20

标签: python function if-statement recursion

我有一个关于使用if语句和递归的函数调用的问题。 我有点困惑因为python似乎跳进了if语句块,即使我的函数返回" False"

以下是一个例子:

1    def function_1(#param):
2       if function_2(#param):
3           #do something
4           if x<y:
5               function_1(#different parameters)
6           if x>y:
7               function_1(#different parameters)

我的function_2返回&#34; False&#34;但是python继续第5行的代码。谁能解释这种行为?提前感谢您的任何答案。

编辑:抱歉,忘了括号

具体例子:

1    def findExit(field, x, y, step):
2        if(isFieldFree(field, x, y)):
3            field[y][x] = filledMarker
4            findExit(field, x + 1, y, step+1)
5            findExit(field, x - 1, y, step+1)
6            findExit(field, x, y + 1, step+1)
7            findExit(field, x, y - 1, step+1)
8        elif(isFieldEscape(field, x, y)):
9            way.append(copy.deepcopy(field))
10            wayStep.append(step+1)

    def isFieldFree(field, x, y):
        if field[y][x] == emptyMarker:
            return True
        else:
            return False

    def isFieldEscape(field, x, y):
        if field[y][x] == escapeMarker:
            return True
        else:
            return False

在两个函数之后&#34; isFieldFree&#34;和#34; isFieldEscape&#34; return False python继续第5行中的代码,有时在第6行。

2 个答案:

答案 0 :(得分:5)

简答:

那是因为你实际上没有调用这个函数。您可以使用括号来调用该函数。

if function2():
    ...

答案很长:

Python中的函数是一等公民(函数范例),因此仅通过名称来引用函数是完全有效的。以下是有效的语法:

def hello():
    print("Hello")

hello_sayer = hello
hello_sayer() # print "Hello"

下一个发挥作用的概念是非布尔变量的真实性。 在Python中,以下内容被视为False-y

  • 错误
  • 任何数字类型的零,例如,0,0L,0.0,0j。
  • 任何空序列,例如'',(),[]。
  • 任何空映射,例如{}。用户定义类的实例,如果类定义
  • 非零()或 len ()方法,当该方法返回时 整数零或bool值为假。

其他一切都是真实的。由于函数名称不属于上述类别,因此在条件上下文中进行测试时,它被视为True-ish。

参考:https://docs.python.org/3/library/stdtypes.html#truth-value-testing

编辑:之前的问题不完整,没有函数调用。对于这个新问题,AChampion的回答是正确的。

答案 1 :(得分:0)

您可能会误解递归是如何工作的,是的,它继续在第5行或第6行,因为递归已在调用堆栈中的较低级别结束,因此它在调用堆栈中继续处于更高级别。这是一个示例调用堆栈,请注意False之后的下一个操作是较高调用堆栈的下一个findExit()

1 findExit(...):
2    True:
3        field assignment
4.1      findExit(x+1) 
  2          True
  3              field assignment
  4.1            findExit(x+1):
    2                False  # Does not jump to line 5 in current call stack.
  5.1            findExit(x-1):
    .                ...