Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单语句斐波那契_Python_List Comprehension_Fibonacci - Fatal编程技术网

Python 单语句斐波那契

Python 单语句斐波那契,python,list-comprehension,fibonacci,Python,List Comprehension,Fibonacci,可能重复: 这可能是一件非常简单的事情,但我对Python非常陌生。我想出了一个简单的说法斐波那契 [fibs.append(fibs[-2]+fibs[-1]) for i in xrange(1000)] 不过,这并不是一个简单的说法。在触发此语句之前,我需要初始化列表,fibs,即fibs=[0,1] 现在,我有两个问题 我们如何摆脱这个列表初始化语句,fibs=[0,1],使它成为真正的单语句 原始语句打印Nonen次;其中n是传入xrange()的数字。有没有办法完全避免这种情况?

可能重复:

这可能是一件非常简单的事情,但我对Python非常陌生。我想出了一个简单的说法斐波那契

[fibs.append(fibs[-2]+fibs[-1]) for i in xrange(1000)]
不过,这并不是一个简单的说法。在触发此语句之前,我需要初始化列表,
fibs
,即
fibs=[0,1]

现在,我有两个问题

  • 我们如何摆脱这个列表初始化语句,
    fibs=[0,1]
    ,使它成为真正的单语句

  • 原始语句打印
    None
    n次;其中n是传入
    xrange()
    的数字。有没有办法完全避免这种情况?如果语句可以打印系列,则更好。那么我们就不需要显式地打印
    fibs

  • [编辑]

    或者除了返回它附加到的
    列表
    list.append()
    之外,我们还有其他选择吗

    def fib(n):
        return (n in (0,1) and [n] or [fib(n-1) + fib(n-2)])[0]
    

    试试这个

    好吧,这根本不是惯用语。您在这里所做的是使用列表理解作为
    for
    循环的快捷方式。尽管Python的理解可能有副作用,但Python并不是为此而设计的。我想不出有什么办法可以让它发挥作用,这可能是一件好事

    对于你的2),考虑你实际上正在创建一个列表,该项是调用<代码> FIBS的返回值。追加(FIBS(-2)+FIBS(-1))< /代码>,这是一个副作用方法,因此返回<代码> No.< /代码>。有关详细信息,请参阅

    很好的尝试,但这不是Python的用途:)

    这很有效:

    for n in range(1000):
        print(0.4472135954999579392818347337462552470881236719223051448541*(pow(1.6180339887498948482045868343656381177203091798057628621354,n) - pow(-0.618033988749894848204586834365638117720309179805762862135,n)))
    
    这是比奈公式的一个实现。

    为什么它必须是一个单独的语句?生成器在这种情况下会更合适。@Felix:只是玩而已,它不一定非得是。如果你想,你也可以使用类似这样的lambda表达式:lambda n:(n in(0,1)和[n]或[fib(n-1)+fib(n-2)][0],但你更好地理解它的工作原理:)首先,正如你所看到的,它非常慢。其次,我知道我们可以想出一个函数/方法,然后继续将其作为一条语句调用。那不是我想要的。第三,你的解决方案只是给了我最后一个值,而不是完整的序列。@Adeel:我知道这不是你想要的,而是口语表现……你应该试试这个:return((1+math.sqrt(5))**n-(1-math.sqrt(5))**n)/(2nmath.sqrt(5))*@Adeel,maozet这被称为Binet公式,这是我在另一个答案中实现的。它应该适用于Python的
    int
    数字,但它仍然依赖于精度,我不会依赖它。不过,这个想法很好:)如果Python支持(支持?)符号数学,那么在最大可用变量大小的限制下,对于所有n>=1的情况,这将是完全可以解决的。(我不是Python开发人员,这里是::P。)我不支持浮点运算,所以我会保留保留,但我仍然认为在纯整数上下文中引入浮点运算是邪恶的。虽然我可以发誓我写了O(log(n))时间,但显然,当早上6点你还没睡的时候,你开始用1代替log(n)。X_X,在家里度过了一个漫长的夜晚。谢谢您纠正我。假设它是作为实现的,其中
    append()
    返回
    列表。然后就可以这样做,
    list.append().append().append().append()
    。我不认为这有什么问题。@Adeel Ansari只是它不是惯用语,仅此而已。Python既是一种语言,也是一种编码风格。有关副作用返回
    None
    的原因,请参阅。要做链式追加,考虑序列<代码> +<代码>操作符。Evpk:谢谢,我同意第一个。第二次,我想出了一个肮脏的办法,就像我得到两张反对票一样肮脏:)。人们不明白这只是为了好玩。不管怎样,输入+1。肮脏的Python代码是邪恶的,但乐趣是足够的借口。谢谢:)