python语法:如何在计算0时返回0而不是False

python语法:如何在计算0时返回0而不是False,python,syntax,return,return-value,Python,Syntax,Return,Return Value,在一项作业中,我们被要求定义一个斐波那契函数,我用以下方法完成了该函数: def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2) 因此,我尝试将同样的方法应用到斐波那契函数中。经过几次尝试,我让它在所有测试的情况下都能工作,除了s=0时,在这种情况下,当它应该返回0时,它返回False。我就在这里: def fibonacci(n): return ((

在一项作业中,我们被要求定义一个斐波那契函数,我用以下方法完成了该函数:

def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)
因此,我尝试将同样的方法应用到斐波那契函数中。经过几次尝试,我让它在所有测试的情况下都能工作,除了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返回0而不是False,同时保持代码的当前长度/结构?这可能吗

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


明确地说,我已经满足了任务的要求,仅就个人知识而言,我想更清楚地了解返回语句中发生了什么。

如果
y
是,则
x和y或z
习惯用法不起作用。您可以交换条件以使其工作:

def fibonacci(n):
    return n >= 2 and fibonacci(n-1) + fibonacci(n-2) or n
但是,从Python2.5(6年前发布)开始,我们已经有了适当的,不再需要
和/或
黑客:

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

或者甚至编写一个生成器来生成所有的数字,并且只获取所需的数据。

也许这会让它更清晰:

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

请注意,在Python 2.5中引入
y if x else z
之前,人们习惯于使用
x和y或z
的东西,因为这个习语存在这个问题,而且它非常难看。是的,伙计们,我假设现在每个人都会使用2.5以上的东西:)说得很清楚,尽管如此,@jgritty
0或0
0
,因为第二件事是
0
True和0或“oops”
将计算为
“oops”
@verball:No,为清楚起见,在这种情况下,我将使用显式
if:/else:
。这些示例只是为了向您展示如何在必要时在一行中完成(同时也告诉您不应使用
x和y或z
。@verball:是的,请查看我的编辑,如果您也感兴趣,您可以在性能方面做得更好。print是我的朋友,我在这件事上学到了很多东西,但在这件事上我却没有想到这个想法。谢谢您的需求是编写递归斐波那契函数,还是只编写斐波那契函数?因为递归实现具有非常糟糕的(指数)运行时,而非递归实现通常是线性的。一个pythonic的东西可能是一个产生斐波那契序列的生成器…@mata:这个赋值的目的是说明递归的概念。
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a
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