9

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

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

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

我哪里出错了?

4

11 回答 11

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. Ayield将“返回”一个值并暂停生成器。下次你请求一个值时,生成器将继续它停止的地方。

使用生成器可以创建无限序列。正如你在fibGenerator上面的定义中看到的,有一个无限循环,它有一个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

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

于 2013-03-09T00:00:41.653 回答
2

问题在最后一行。我敢肯定,这是一种干扰:您应该打印列表,而不是a.

其他一些提示:

1:整个块只是重新创建返回的列表range

numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)

分配i = 0也没有实际意义。相反,请尝试:

numberlist = range(20)

在 python 3 中, call list(range(20)),因为range不会创建一个完整的列表。

2:每次循环都重新定义fib函数不会产生问题,但肯定没有必要。将定义移到外面:)

于 2013-03-09T00:01:37.390 回答
2

本着提高编程技能的精神:您可以使用生成器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]
于 2013-03-09T00:21:47.133 回答
2

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

我应该打印我的清单。

该死...

于 2013-03-08T23:58:06.810 回答
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]
于 2013-11-05T02:14:27.220 回答
1

我将其浓缩并接受了“范围”或至少列表(范围())创建自己的列表的事实:

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)

那是我以前习惯的风格。无论如何,程序现在看起来不错吗?

于 2013-03-09T00:27:57.040 回答
1

斐波那契数列的第 n 项是:

在此处输入图像描述 在哪里 在此处输入图像描述在此处输入图像描述

使用上面的身份,可以使用列表推导生成系列:

[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
于 2014-02-18T19:33:33.073 回答
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())
于 2015-04-28T22:18:11.823 回答
0

由于每个斐波那契数都是从所有先前的数中生成的,因此从头开始计算每个数是没有意义的。最好使用您收集斐波那契数的列表来计算每个后续数:

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)

如果你真的想变得漂亮,你可以创建一个计算斐波那契值的生成器函数,并使用它来构建你的列表:

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使用生成器构建列表。您也可以在 for 循环中使用生成器:

for fnum in Fib(20):
    print fnum
于 2013-03-09T00:20:14.667 回答
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

每次循环运行时,列表中的最后两个值都会相加。在迭代到输入长度时,使用每个新的斐波那契值创建列表中的新位置。

于 2016-10-03T07:57:13.863 回答
0

为什么不使用列表推导?这是我解决问题的方法。我将定义一个函数来计算斐波那契数列的第n项,如下所示。

def fibo(n):
    if n<=2:
        return 1
    else:
        res = fibo(n-1) + fibo(n-2)
    return res

然后我会使用列表理解来获得我想要的序列。

fib_sequence = [fibo(i) for i in range(n+1)]
于 2018-09-24T22:39:50.620 回答