Python 从传统循环到列表理解

Python 从传统循环到列表理解,python,list,loops,fibonacci,Python,List,Loops,Fibonacci,我正在处理一个挑战,我想将我的代码(有效的)转换成一个更高效的代码。给定一个数字prod(对于乘积),我们搜索两个Fibonacci数F(n)和F(n+1)验证F(n)*F(n+1)=prod 这是我的原始代码 def productFib(prod): fibonacci_numbers = [0, 1] for i in range(2,prod+1): fibonacci_numbers.append(fibonacci_numbers[i-1]+fibon

我正在处理一个挑战,我想将我的代码(有效的)转换成一个更高效的代码。给定一个数字prod(对于乘积),我们搜索两个Fibonacci数
F(n)
F(n+1)
验证
F(n)*F(n+1)=prod

这是我的原始代码

def productFib(prod):
    fibonacci_numbers = [0, 1]
    for i in range(2,prod+1):
        fibonacci_numbers.append(fibonacci_numbers[i-1]+fibonacci_numbers[i-2])

    pairing = [[fibonacci_numbers[i], fibonacci_numbers[i+1]] for i in range((len(fibonacci_numbers)-1))]
    for ind, pair in enumerate(pairing):
        if pair[0]*pair[1] ==prod:
            ans=[pair[0], pair[1], True]
            return ans
        elif all(pair[0]*pair[1] !=prod for pair in pairing)==True:
            match=next(x for x in pairing if x[0]*x[1]>prod)
            ans=[match[0], match[1], False]
            return ans
            break
def productFib(产品):
斐波那契数=[0,1]
对于范围内的i(2,产品+1):
fibonacci_数。追加(fibonacci_数[i-1]+fibonacci_数[i-2])
配对=[[fibonacci_数[i],fibonacci_数[i+1],True]如果[fibonacci_数[i]*fibonacci_数[i+1]==prod\
else[下一步(斐波那契数字[n]表示范围内的n(len(斐波那契数字)-1)如果斐波那契数字[n]*斐波那契数字[n+1]>prod,下一步(斐波那契数字[n+1]表示范围内的n(len(斐波那契数字)-1)如果斐波那契数字[n]*斐波那契数字[n+1]>prod,False]如果全部(斐波那契数字[i]*斐波那契数字[i+1]!=True)\
对于范围内的i((len(fibonacci_数)-1))]
返回配对
我希望它会回来:

[F(n), F(n+1), true] or [F(n), F(n+1), false]

根据数字产品,我们搜索两个斐波那契数字F(n)和F(n+1)验证->F(n)*F(n+1)=prod

通常,有一些方法可以简化问题:

  • 另一种更简单、更有效的方法
  • 更具蟒蛇风格
  • F(n)*F(n+1)=prod,n的数量不超过一个。我认为你的想法是可以的,你可以产生你的fib列表,同时判断如果f(n)*f(n+1)=prob,也许你的代码可以更简单

    prod = 50  # random value for your product
    top_limit = int(prod ** 0.5)  # you should set a suitable top limit
    def fib(top):
        n, a, b = 0, 0, 1
        while n < top:
            a, b = b, a + b
            if a * b == prod:
                yield [a,b,True]
            else:
                yield [a,b,False]
            n = n + 1
    list(fib(top_limit))
    

    你看,13*21=273>>50,你可以设置变量
    top\u limit
    甚至更小

    我相信这个修改模仿了你原来的代码,但是非常简单:

    def productFib(target):
        fibonacci = [0, 1]
    
        while True:
            product = fibonacci[0] * fibonacci[1]
    
            if product >= target:
                return fibonacci + [product == target]
    
            fibonacci[:] = fibonacci[1], sum(fibonacci)
    
    print(productFib(272))
    print(productFib(273))
    print(productFib(274))
    
    输出

    > python3 test.py
    [13, 21, False]
    [13, 21, True]
    [21, 34, False]
    >
    

    您已经暗示了两个目标:“更高效”和“列表理解”——我选择了“更高效”。

    列表理解对于简单的转换很好。随着计算变得越来越复杂,列表理解开始严重损害可读性。不管作为列表理解是否是一个好主意(毕竟,您说这是一个挑战)-您当前的实现返回什么(即,它在哪里失败)?范围内的for i中的SyntaxError((len)(斐波那契数字)-1)就在最后。我知道这个列表理解有点“疯狂”,但练习起来也很好
    > python3 test.py
    [13, 21, False]
    [13, 21, True]
    [21, 34, False]
    >