Python 斐波那契数列生成器

35

我需要编写一个程序,要求用户输入要打印的斐波那契数列的数量,然后像 0、1、1、2... 这样打印它们,但是我无法让它正常工作。我的代码如下:

a = int(raw_input('Give amount: '))

def fib():
    a, b = 0, 1
    while 1:
        yield a
        a, b = b, a + b

a = fib()
a.next()
0
for i in range(a):
    print a.next(),

1
我认为“while True”更加简洁。 - Jacques de Hooge
第二次迭代如何理解“a=1”?我们不应该写成“a=a+b”而不是“a,b=b,a+b”吗? - user177196
1
@user177196 这个表达式是一个由两部分组成的表达式。首先,它使用当前的 ab 值创建一个元组 (b,a+b),然后在将其分配给 a,b 时解包该元组。(严格来说,Python 可以进行一些优化,但我现在忽略这一点)。 - iAdjunct
21个回答

54

我会使用这种方法:

Python 2

a = int(raw_input('Give amount: '))

def fib(n):
    a, b = 0, 1
    for _ in xrange(n):
        yield a
        a, b = b, a + b

print list(fib(a))

Python 3

a = int(input('Give amount: '))

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

print(list(fib(a)))

1
fib(0) 不会产生任何结果,可以使用 range(n+1) 来修复。 - AgentRev
我用a=0,b=1,a=b和b=a+b重新编写了这段代码,因为我对那种表示法感到不舒服,但结果完全不同。我是不是漏掉了什么? - Neosapien

27

你给 a 赋予了太多的意义:

a = int(raw_input('Give amount: '))

对比。

a = fib()       

如果你给变量起更具描述性的名称,就不会(那么经常)遇到这个问题了(在10行代码中使用名称a的3种不同用途!):

amount = int(raw_input('Give amount: '))

range(a)更改为range(amount)


17

既然你正在编写一个生成器,为什么不使用两个yield来节省额外的洗牌操作呢?

import itertools as it

num_iterations = int(raw_input('How many? '))
def fib():
    a,b = 0,1
    while True:
        yield a
        b = a+b
        yield b
        a = a+b

for x in it.islice(fib(), num_iterations):
    print x

.....


13

使用生成器非常简单:

def fin(n):
    a, b = 0, 1

    for i in range(n):
        yield a
        a, b = b, a + b


ln = int(input('How long? '))
print(list(fin(ln))) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...]

5

Python是一种动态类型语言。变量的类型在运行时确定,随着执行的进行而变化。在这里,首先声明了一个变量a来保存整数类型,然后又将一个函数赋值给它,因此它的类型现在变成了一个函数。

你试图将“a”作为参数应用于range()函数,但该函数期望一个int类型的参数,实际上你提供了一个函数变量作为参数。

更正后的代码应该是:

 a = int(raw_input('Give amount: '))

def fib():
    a, b = 0, 1
    while 1:
        yield a
        a, b = b, a + b

b = fib()
b.next()

for i in range(a):
    print b.next(),

这将会起作用。


我在这里遇到了错误 File "D:\Projects\Python\fibonacci.py", line 18, in <module> b.next()AttributeError: 'generator' object has no attribute 'next' - Jyothish Bhaskaran
1
我找到了 Python 3 的相应函数,它是 b.next()。抱歉 :) 谢谢。 - Jyothish Bhaskaran

4
def fibonacci(n):
    fn = [0, 1,]
    for i in range(2, n):
        fn.append(fn[i-1] + fn[i-2])
    return fn

3
要使用生成器获取斐波那契数列中的任意数字(例如100),您可以这样做。
def getFibonacci():
    a, b = 0, 1

    while True:
        yield b
        b = a + b
        a = b - a

for num in getFibonacci():
    if num > 100:
        break
    print(num)

3
def genFibanocciSeries():

    a=0
    b=1
    for x in range(1,10):
        yield a
        a,b = b, a+b

for fib_series in genFibanocciSeries():
    print(fib_series)

2

打印斐波那契数列直到n的简单方法

def Fib(n):
    i=a=0
    b=1
    while i<n:
        print (a)
        i=i+1
        c=a+b
        a=b
        b=c




Fib(input("Please Enter the number to get fibonacci series of the Number :  "))

2

你的a可以说是一个全局变量。

a = int(raw_input('Give amount: '))

无论何时Python看到一个a,它都认为你在谈论上面那个。将其称为其他名称(如elsewhere或here)应该会有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接