Python斐波纳契生成器

时间:2010-10-17 15:00:54

标签: python fibonacci naming-conventions

我需要制作一个程序,询问打印的Fibonacci数量,然后将它们打印出来,如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(),

19 个答案:

答案 0 :(得分:26)

我会使用这种方法:

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 :(得分:23)

你给a含义太多了:

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

VS

a = fib()       

如果您为变量提供更具描述性的名称(在10行代码中对名称a进行3次不同使用),您将不会遇到问题(经常)!:

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

并将range(a)更改为range(amount)

答案 2 :(得分:13)

既然你正在编写一个生成器,为什么不使用两个收益,以节省额外的洗牌?

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

.....

答案 3 :(得分:4)

使用生成器非常简单:

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, ...]

答案 4 :(得分:2)

您的a是一个全球名称。

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

每当Python看到a时,它就会认为你在谈论上面的那个。把它叫做别的东西(别处或这里)应该会有所帮助。

答案 5 :(得分:2)

将Fibonacci系列打印到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 :  "))

答案 6 :(得分:2)

要使用生成器获取斐波那契数字直到任意数字(在本例中为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)

答案 7 :(得分:2)

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

答案 8 :(得分:2)

你有正确的想法和非常优雅的解决方案,你需要做的就是你交换和添加a和b的声明。您的收益率陈述也应该在您的掉期之后

a, b = b, a + b ####应为a,b = a+b,a #####

`###yield a`

答案 9 :(得分:2)

此外,您可以尝试封闭形式的解决方案(由于舍入/溢出错误,无法保证非常大的n值):

root5 = pow(5, 0.5)
ratio = (1 + root5)/2

def fib(n):
    return int((pow(ratio, n) - pow(1 - ratio, n))/root5)

答案 10 :(得分:2)

您也可以使用枚举无限生成器:

for i,f  in enumerate(fib()):
    print i, f
    if i>=n: break

答案 11 :(得分:2)

Python是一种动态类型语言。变量的类型在运行时确定,并且可以在执行过程中变化。 首先,您声明了一个包含整数类型的函数,之后您为其分配了一个函数,因此它的类型现在变成了一个函数。

你试图将' a '作为参数应用于 range()函数,该函数需要一个int arg,但实际上你提供了一个函数变量作为参数。

更正的代码应为

 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(),

这将起作用

答案 12 :(得分:1)

我刚刚建立了这个:

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

fab = [0, 1, 1]
def fab_gen():
    while True:
        fab.append(fab[-1] + fab[-2])
        yield fab[-4]

fg = fab_gen()
for i in range(a): print(fg.next())

不,fab会随着时间的推移而增长,因此它不是一个完美的解决方案。

答案 13 :(得分:1)

看起来您正在使用a两次。尝试将其更改为其他变量名称。

以下似乎对我有用。

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

f = fib()
for x in range(100):
    print(f.next())

答案 14 :(得分:1)

我喜欢这个版本:

array = [0,1]

for i in range(20):
   x = array[0]+array[1]   
   print(x)
   array[0] = array[1]
   array[1] = x

答案 15 :(得分:1)

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)

答案 16 :(得分:0)

以下是产生斐波那契的两种解决方案:

def fib_generator(num):
    '''
    this will works as generator function and take yield into account.
    '''
    assert num > 0
    a, b = 1, 1
    while num > 0:
        yield a
        a, b = b, a+b
        num -= 1


times = int(input('Enter the number for fib generaton: '))
fib_gen = fib_generator(times)
while(times > 0):
    print(next(fib_gen))
    times = times - 1


def fib_series(num):
    '''
    it collects entires series and then print it.
    '''
    assert num > 0
    series = []
    a, b = 1, 1
    while num > 0:
        series.append(a)
        a, b = b, a+b
        num -= 1
    print(series)


times = int(input('Enter the number for fib generaton: '))
fib_series(times)

答案 17 :(得分:0)

print( .. )

答案 18 :(得分:-1)

我们可以在不通过'yield 和'next' 语句的情况下快速使用它

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