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代码是邪恶的,但乐趣是足够的借口。谢谢:)