【问题标题】:Python Fibonacci GeneratorPython 斐波那契生成器
【发布时间】:2011-04-26 14:35:28
【问题描述】:

我需要编写一个程序来询问打印的斐波那契数字的数量,然后将它们打印为 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(),

【问题讨论】:

  • 我认为'while True'更简洁
  • 第二次迭代如何理解“a=1”?我们不应该写 a = a+b 而不是 "a, b=b, a+b"
  • @user177196 该表达式是一个由两部分组成的表达式。首先,它使用ab 的当前值创建一个带有(b,a+b) 的元组,然后在将其分配给a,b 时解压缩该元组。 (从技术上讲,Python 可以做一些优化,但我暂时忽略了这一点)。

标签: python fibonacci naming-conventions


【解决方案1】:

你给a的含义太多了:

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

对比

a = fib()       

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

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

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

【讨论】:

    【解决方案2】:

    您的a 可以说是一个全局名称。

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

    每当 Python 看到 a 时,它就会认为你在谈论上面的那个。将其称为其他名称(其他地方或此处)应该会有所帮助。

    【讨论】:

      【解决方案3】:

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

      这会起作用

      【讨论】:

      • 我在这个文件“D:\Projects\Python\fibonacci.py”上出现错误,第 18 行,在 b.next() AttributeError: 'generator' object has no attribute'下一个'
      • 我为 Python 3 找到了它,它是 b.__next__()。对不起 :) 和谢谢
      【解决方案4】:

      我之前已经构建了这个:

      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 不会随着时间的推移而增长,所以它不是一个完美的解决方案。

      【讨论】:

        【解决方案5】:

        我会用这个方法:

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

        【讨论】:

        • fib(0) 不会产生任何结果,可以改用range(n+1) 来修复。
        • 我用 a=0、b=1、a=b 和 b=a+b 重写了这个,因为我对这种表示法感到不舒服,但它给出了完全不同的答案。我错过了什么吗?
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          root5 = pow(5, 0.5) 比率 = (1 + root5)/2 定义纤维(n): return int((pow(ratio, n) - pow(1 - ratio, n))/root5)

          【讨论】:

            【解决方案8】:

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

            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
            

            .....

            【讨论】:

              【解决方案9】:

              你有正确的想法和一个非常优雅的解决方案,你需要做的只是交换和添加 a 和 b 的语句。你的收益声明也应该在你的交换之后

              a, b = b, a + b #### 应该是a,b = a+b,a #####

              `###yield a`
              

              【讨论】:

                【解决方案10】:
                def fibonacci(n):
                    fn = [0, 1,]
                    for i in range(2, n):
                        fn.append(fn[i-1] + fn[i-2])
                    return fn
                

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    【解决方案12】:

                    打印斐波那契数列直到 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 :  "))
                    

                    【讨论】:

                      【解决方案13】:

                      您似乎使用了两次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】:

                        我喜欢这个版本:

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

                        【讨论】:

                          【解决方案15】:

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

                          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)
                          

                          【讨论】:

                            【解决方案16】:
                            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)
                            

                            【讨论】:

                              【解决方案17】:
                              a = 3 #raw_input
                              
                              def fib_gen():
                                  a, b = 0, 1
                                  while 1:
                                      yield a
                                      a, b = b, a + b
                              
                              fs = fib_gen()
                              next(fs)
                              for i in range(a):
                                  print (next(fs))
                              

                              【讨论】:

                              • 这里不鼓励只回答代码。鼓励添加一些详细信息来说明此代码将如何解决问题。
                              【解决方案18】:

                              生成器真的很简单:

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

                              【讨论】:

                                【解决方案19】:

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

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

                                【讨论】:

                                • 是的,但问题是要求打印第一个 n 数字,而不是 nth 数字...
                                【解决方案20】:

                                你为什么要在这里搞复杂是我的 sn-p 工作之一!!

                                n = int(input('Enter your number..: '))
                                a = 0
                                b = 1
                                c = 0
                                print(a)
                                print(b)
                                for i in range(3, n+1):
                                    c = a+b
                                    print(c)
                                    a,b=b,c 
                                

                                查看我的 git - rohith-sreedharan

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2011-12-18
                                  • 2015-04-25
                                  • 1970-01-01
                                  • 2017-11-13
                                  • 2013-02-24
                                  相关资源
                                  最近更新 更多