python语法:在评估0时如何返回0而不是False

时间:2012-05-09 19:33:13

标签: python syntax return return-value

对于一项任务,我们被要求定义一个斐波那契函数,我完成了这个:

def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

但是,我已经看到了递归函数,例如factorial函数,在一行返回语句中定义如下:

def factorial(n):
    return n > 1 and n * factorial(n-1) or 1

所以,我试图将其应用于我的斐波那契函数。经过几次尝试后,我得到它适用于所有测试用例,除非s = 0,在这种情况下,当它应该返回0时返回False。这就是我的位置:

def fibonacci(n):
    return ((n == 0 or n == 1) and n) or (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))

我理解python将0计算为False,那么当n为0时,如果保持代码的当前长度/结构,我将如何使python返回零而不是False?这甚至可能吗?

此外,这种创建函数(递归或其他)的风格是否比教科书版本更好或更不可取/ pythonic? (我想象的不仅仅是因为可读性)

要说清楚,我已经满足了作业的要求,而且仅仅为了个人知识,我希望更清楚地了解回报声明中发生的事情。

2 个答案:

答案 0 :(得分:10)

如果x and y or zfalsy,则y成语不起作用。您可以交换条件以使其工作:

def fibonacci(n):
    return n >= 2 and fibonacci(n-1) + fibonacci(n-2) or n

但是,从Python 2.5(6年前发布)开始,我们已经有了conditional expressions,并且不再需要and/or黑客攻击了:

def fibonacci(n):
    return n if n < 2 else fibonacci(n-1) + fibonacci(n-2)

现在这具有指数运行时复杂性。如果您想提高效率,请使用O(n)算法:

def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

甚至可以编写一个生成器来生成所有数字,只需要尽可能多的数据。

答案 1 :(得分:1)

也许这使得它更清晰:

def fibonacci(n):
    print ((n == 0 or n == 1) and n)
    print (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))
    return ((n == 0 or n == 1) and n) or (n > 1 and (fibonacci(n-1) + fibonacci(n-2)))


print 0 or False
print False or 0