我只是想通过制作一些基本功能来提高我的编程技巧。
我想用斐波纳契值填充一个列表,但我认为我的代码给出了所有数字的总和,然后打印出来......
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
print numberlist
fibonaccinumbers = []
for n in numberlist:
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
a = fib(n)
fibonaccinumbers.append(a)
print a
我哪里出错?
答案 0 :(得分:12)
print a
好吧,你打印最终值。
还有一些关于您的代码的评论:
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
你不需要在那里初始化i
,for循环就是为你做的。此外,您可以通过以下方式简化整个块:
numberlist = list(range(20))
鉴于您实际上并不需要将其作为列表,您根本不需要构建它,但您可以稍后运行for n in range(20)
。
然后你一遍又一遍地重新定义循环内的fib
函数。你应该在它之外定义它,然后重复使用它。
此外,当您知道要创建多个斐波那契数字列表时,只需存储您计算的所有数字。这样你就不必一遍又一遍地做同样的事情。您还可以使用生成器函数使这一切变得更容易:
def fibGenerator():
a, b = 0, 1
yield 0
while True:
a, b = b, a + b
yield a
fibonaccinumbers = []
fib = fibGenerator()
for n in range(20):
fibonaccinumbers.append(next(fib))
不是迭代一个范围并手动调用生成器上的next
,而是还可以使用itertools中的take
-recipe来执行此操作:
fibonaccinumbers = take(20, fibGenerator())
但仍不太确定发电机的作用。
生成器是一个Python函数,它生成一系列返回值。这些值是懒惰生成的,这意味着当您请求时。您只需使用yield
代替return
即可创建生成器。 yield
将“返回”一个值并暂停生成器。下次请求值时,生成器将从中断处继续。
使用生成器可以创建无限序列。正如您在上面fibGenerator
的定义中所看到的,有一个无限的while循环,里面有yield
。当发电机停止时,尽管有这个循环,它也不会挂起。
这是一个快速的自我解释的例子:
>>> def example():
print('begin')
i = 0
while True:
print('Calculating next value')
yield i
i += 1
>>> g = example()
>>> next(g)
begin
Calculating next value
0
>>> next(g)
Calculating next value
1
>>> next(g)
Calculating next value
2
>>> next(g)
Calculating next value
3
>>> next(g)
Calculating next value
4
next
函数是内置函数,它从 iterable 中请求下一个值。迭代是你可以迭代的任何东西(例如for x in iterable: ...
);任何生成器也是可迭代的。
答案 1 :(得分:2)
抱歉,我是个白痴。我正在打印'a',这是斐波那契的最后一次迭代计算。
我本应该打印我的清单。
...该死
答案 2 :(得分:2)
问题出在最后一行。分散注意力,我敢肯定:你应该打印清单,而不是a
。
其他一些提示:
1:这整个块只是重新创建range
返回的列表:
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
分配i = 0
也没有实际意义。相反,尝试:
numberlist = range(20)
在python 3中,调用list(range(20))
,因为range
不会创建完整的列表。
2:在循环的每次传递中重新定义fib
函数不会产生问题,但肯定没有必要。将定义移到外面:)
答案 3 :(得分:2)
本着提高编程技能的精神:您可以使用a generator和itertools.islice()获取第一个n
斐波纳契数列表:
from itertools import islice
def fib(a=0, b=1):
yield a
while True:
yield b
a, b = b, a + b
fibonacci_numbers = list(islice(fib(), 20))
print(fibonacci_numbers)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
答案 4 :(得分:2)
以为我会分享一些pyLove:
def fib(n, a = 0, b = 1):
seq = [a,b]
while len(seq) < n:
seq += [seq[len(seq)-1] + seq[len(seq)-2]]
return seq
print(fib(13))
输出为:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
或强>
#or if you want to make up your own
print(fib(13, 1597, 2584))
输出为:
[1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229]
答案 5 :(得分:1)
我将其浓缩并接受了'range'或至少list(range())创建自己的列表的事实:
numberlist = list(range(20))
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
fibonaccinumbers = [fib(n) for n in numberlist]
print fibonaccinumbers
似乎有效,将每个斐波那契值打印到第20次迭代。我怎么能在def之外调用'fib(n)'而不做一些奇怪的事情,例如:
a = fib(n)
这是我以前习惯的风格。无论如何,该程序现在看起来不错吗?
答案 6 :(得分:1)
哪里 和
使用上述标识,可以使用列表推导生成系列:
[int(((((1 + math.sqrt(5)) / 2) ** x) - (((1 - math.sqrt(5)) / 2) ** (x))) / math.sqrt(5)) for x in range(n)] //where n is the number of terms in the series
答案 7 :(得分:0)
由于每个斐波那契数都来自所有先前的数,因此从头开始计算每个斐波那契数是没有意义的。最好使用收集Fibonacci数字的列表来计算每个后续数据:
def FibList(n):
rc = []
for i in xrange(n):
if i < 2:
rc.append(1)
else:
rc.append(rc[i-2] + rc[i-1])
return rc
print FibList(20)
如果你真的想要漂亮,你可以创建一个计算Fibonacci值的生成器函数,并用它来构建你的列表:
def Fib(n):
n1 = 1
n2 = 1
for i in xrange(n):
if i < 2:
yield 1
else:
n3 = n1 + n2
n1 = n2
n2 = n3
yield n3
fiblist = [x for x in Fib(20)]
print fiblist
在生成器函数中,'yield'关键字返回列表的每个值。 fiblist
使用称为“list comprehension”的内容使用生成器构建列表的行。您也可以在for循环中使用生成器:
for fnum in Fib(20):
print fnum
答案 8 :(得分:0)
我刚刚使用了公式并插入了值:
import math
def Fibs(n):
for i in range (n):
Fn=int(((((1+math.sqrt(5))**i) - ((1-math.sqrt(5)) **i))/(2**i) * (math.sqrt(5)))/5)
print (Fn)
Fibs(int(input())
答案 9 :(得分:0)
def fibonacci(number):
numbers = [0, 1]
while len(numbers) < number:
numbers[len(numbers):len(numbers)] = [numbers[len(numbers)-2] + numbers[len(numbers)-1]]
return numbers
每次循环运行时,列表中的最后两个值都会相加。 使用每个新的斐波纳契值创建列表中的新位置,同时迭代到输入的长度。
答案 10 :(得分:0)
为什么不使用列表推导?这是我解决问题的方法。我将定义一个函数,如下所述计算斐波那契数列的第 n 条。
df.set_index('Bob',append=True,inplace=True)
>>> df
Count Price
Fruit Color Bob
Apple Red 0 3 $1.29
Green 1 9 $0.99
Pear Red 0 25 $2.59
Green 1 26 $2.79
Lime Green 0 99 $0.39
然后,我将使用列表推导来获取所需的序列。
def fibo(n):
if n<=2:
return 1
else:
res = fibo(n-1) + fibo(n-2)
return res