单语句斐波那契数列

3
可能重复:
如何在Python 3中使用一行代码输出斐波那契数列? 这可能很简单,但我对Python非常陌生。我想出了这个单语句斐波那契数列。
[fibs.append(fibs[-2]+fibs[-1]) for i in xrange(1000)]

虽然不是单一语句,但我需要在执行这个语句之前初始化列表fibs,即fibs = [0, 1]

现在,我有两个问题,

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

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

[编辑]

或者我们有任何替代list.append()的方法,它返回附加到的list吗?


为什么必须是单个语句?在这种情况下,生成器会更加合适。 - Felix Kling
@Felix:只是玩玩而已,没必要那么认真。 - Adeel Ansari
3个回答

3

1
它应该适用于Python的“int”数字,但仍然依赖于精度,我不会依赖它。不过想法不错 :) - Evpok
如果Python支持符号数学,那么在最大可用变量大小的限制下,对于所有n>=1,这将可以精确地解决。 (我不是Python开发人员,哈哈。) - Zéychin
我不是浮点数的专家,所以我会保留意见,但我仍然认为在纯整数环境中引入浮点数是不好的。虽然我并没有应该被投反对票。 - Evpok
1
虽然对于实现而言加1分 - Jakob Bowyer
我本来以为我写的是O(log(n))时间复杂度,但显然当凌晨6点而你还没睡觉时,你开始把log(n)替换成1。X_X。这是一个漫长的夜晚。谢谢你纠正我。 - Zéychin

2

这样做并不符合惯用语。你在这里使用了列表推导式来作为 for 循环的快捷方式。虽然 Python 的推导式可以产生副作用,但 Python 并不是为此而设计的。我无法想到任何方法让它正常工作,这也可能是一件好事。

对于第二个问题,需要考虑你正在创建一个列表,其中的项是调用 fibs.append(fibs[-2]+fibs[-1]) 这个具有副作用的方法的返回值,因此返回值为 None。详见文档

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


假设它被实现为,其中append()返回list。那么就可以像这样做:list.append().append().append()。我认为这没有任何问题。 - Adeel Ansari
@Adeel Ansari 这只是因为它不符合惯用语,仅此而已。Python既是一种编程语言,也是一种编码风格。至于为什么副作用返回None,请参见https://dev59.com/WG455IYBdhLWcg3wD_sB#4568169。要进行链式附加,请考虑使用http://docs.python.org/dev/py3k/library/stdtypes.html#sequence-types-str-bytes-bytearray-list-tuple-range序列`+`运算符。 - Evpok
1
Evpok:谢谢,我同意第一个观点。对于第二个观点,我想出了一个不太好的解决方法,结果得到了两个负评。大家似乎没有理解这只是为了好玩。无论如何,感谢你的建议,我给你点赞。 - Adeel Ansari
肮脏的 Python 代码是邪恶的,但是有趣就足够了。谢谢 :) - Evpok

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

试一下这个


如果您想,您也可以使用类似于此的 lambda 表达式: lambda n: (n in (0,1) and [n] or [fib(n-1) + fib(n-2)])[0] 但最好先理解它的工作原理 :)。 - Samuele Mattiuzzo
1
首先,正如您所看到的那样,它非常慢。其次,我知道我们可以想出一个函数/方法,然后继续调用它作为单个语句。这不是我想要的。第三,你的解决方案只给了我最后一个值,而不是完整的系列。 - Adeel Ansari
1
@Adeel:我知道这不是你想要的,但是就性能而言...你应该尝试这个:**return ((1+math.sqrt(5))n-(1-math.sqrt(5))n)/(2n*math.sqrt(5)) - maozet
2
@Adeel,maozet 这被称为Binet公式,这是我在另一个答案中实现的。 - Zéychin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接