Python:Fibonacci序列

Da *_* Bx 9 python fibonacci

我只是想通过制作一些基本功能来提高我的编程技巧.

我想用斐波纳契值填充一个列表,但我认为我的代码给出了所有数字的总和并打印出来了.

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
Run Code Online (Sandbox Code Playgroud)

我哪里出错了?

pok*_*oke 12

print a
Run Code Online (Sandbox Code Playgroud)

好吧,你打印最终值.


还有一些关于您的代码的评论:

numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)
Run Code Online (Sandbox Code Playgroud)

你不需要在i那里初始化,for循环就是为你做的.此外,您只需执行以下操作即可简化整个块:

numberlist = list(range(20))
Run Code Online (Sandbox Code Playgroud)

鉴于您实际上并不需要将其作为列表,您根本不需要构建它,但您可以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))
Run Code Online (Sandbox Code Playgroud)

相反迭代一个范围,并呼吁的next手动发电机上,然后你也可以只使用take-配方从itertools做到这一点,就像这样:

fibonaccinumbers = take(20, fibGenerator())
Run Code Online (Sandbox Code Playgroud)

在发电机上

但是还不太确定发电机的功能.

生成器是一个Python函数,它生成一系列返回值.这些值是懒惰生成的,这意味着当您请求它时.您只需使用yield而不是创建生成器return.A 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
Run Code Online (Sandbox Code Playgroud)

next函数是内置函数,它从迭代中请求下一个值.迭代是你可以迭代的任何东西(例如for x in iterable: ...); 并且任何生成器也是可迭代的.


Da *_* Bx 2

抱歉我是个白痴。我正在打印“a”,这是斐波那契的最后一次迭代计算。

我应该打印我的清单。

该死...