Python如何评估';和';在递归函数中?

Python如何评估';和';在递归函数中?,python,Python,让我们想象一下,我们想要检查列表中的所有元素是否都是正数。我们可以定义一个函数: def check_positive(array): if not array: return True else: if array[0] <= 0: return False else: return check_positive(array[1:]) 这个函数也是递归的吗 我想,我要问的是,

让我们想象一下,我们想要检查列表中的所有元素是否都是正数。我们可以定义一个函数:

def check_positive(array):
    if not array:
        return True
    else:
        if array[0] <= 0:
            return False
        else:
            return check_positive(array[1:])
这个函数也是递归的吗

我想,我要问的是,如果您让Python评估:

True and (f(x))
它会求值
f(x)
然后求值
True和(无论f(x)的结果是什么)
,还是求值
True和f(x)
以等效于“f(x)”,并通过求值“f(x)”结束对表达式的求值?

您的行:

return (array[0] > 0) and (check_positive(array[1:]))
将计算数组[0]>0。如果为false,它将返回false而不调用
check\u positive
。如果为true,则它将调用
check_positive(数组[1:])
。因此,它的评估顺序与第一个示例相同


请注意,尽管尾部递归在Python中不是一个有趣的特性,因为Python不进行尾部调用优化。

您可以这样测试它:

arr = [0]*10**6
check_positive(arr)
与此相比,这将立即结束:

arr = [1]*10**6
check_positive(arr)
这很慢

所以你可以得出结论,是的,它是尾部递归的


(在python tho中这是一种可怕的方法)

您可以尝试看看会发生什么。设计一个简单的测试来区分这两种行为并不困难。它评估函数,然后将结果与真值进行比较。@MaxPowers,…它检查它是否真(即
bool(x)是否真
),这与直接比较真值不同。数字
10
是真的,但是
10==True
是假的。真的?据我所知,在Python中,BOOLS是用整数实现的,这就是为什么<代码> 10=真/<代码>是错误的,但是<代码> 1=真/<代码>是真的。“和”、“或”、“如果”、“而”则考虑事物的真实性或谬误。代码>[]是虚假的,
[1]
是真实的<代码>“是虚假的,
“x”
是真实的,依此类推。
arr = [1]*10**6
check_positive(arr)