Python:斐波纳契序列

2024-04-19 18:40:49 发布

您现在位置: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

我哪里做错了?


Tags: 函数代码in列表for技巧编程range
3条回答
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))

然后,您也可以使用itertools中的^{}-recipe来执行以下操作,而不是遍历一个范围并手动调用生成器上的next

fibonaccinumbers = take(20, fibGenerator())

关于发电机

Still not too sure what the generator does however.

生成器是一个Python函数,它生成一系列返回值。这些值是惰性生成的,这意味着当您请求时。只需使用yield而不是return即可创建生成器。Ayield将“返回”一个值并暂停生成器。下一次请求值时,生成器将继续其关闭的位置。

使用生成器可以创建无休止的序列。正如您在上面的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下一个值的内置函数。iterable是任何可以迭代的东西(例如for x in iterable: ...);任何生成器也是iterable。

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

我本来应该打印我的单子的。

该死的。。。

问题在最后一行。我敢肯定,这会分散你的注意力:你应该打印列表,而不是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函数不会产生问题,但肯定不是必需的。将定义移到外部:)

相关问题 更多 >