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

Ver*_*int 4 python syntax return return-value

对于作业,我们被要求定义一个斐波纳契函数,我用这个完成了:

def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)
Run Code Online (Sandbox Code Playgroud)

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

def factorial(n):
    return n > 1 and n * factorial(n-1) or 1
Run Code Online (Sandbox Code Playgroud)

所以,我试图将其应用于我的斐波那契函数.经过几次尝试后,我得到它适用于所有测试用例,除非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)))
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nik*_* B. 10

x and y or z如果y假的话,成语不起作用.您可以交换条件以使其工作:

def fibonacci(n):
    return n >= 2 and fibonacci(n-1) + fibonacci(n-2) or n
Run Code Online (Sandbox Code Playgroud)

但是,从Python 2.5(6年前发布)开始,我们有适当的条件表达式,不再需要and/orhack:

def fibonacci(n):
    return n if n < 2 else fibonacci(n-1) + fibonacci(n-2)
Run Code Online (Sandbox Code Playgroud)

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

def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a
Run Code Online (Sandbox Code Playgroud)

或者甚至编写一个生成器来生成所有数字,并且只需要尽可能多的数量.

  • 请注意,在Python 2.5中,人们过去常常使用`y和y或z`之前的东西,因为这个成语存在这个问题,因为它无论如何都是丑陋的. (2认同)
  • @Verbal:不,为了清楚起见,在这种情况下,我会使用明确的`if:/ else:`.这些例子只是为了向您展示如何在必要时在一行中完成它(并且还告诉您不应该使用`x和y或z`). (2认同)