Python 从传统循环到列表理解
我正在处理一个挑战,我想将我的代码(有效的)转换成一个更高效的代码。给定一个数字prod(对于乘积),我们搜索两个Fibonacci数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
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通常,有一些方法可以简化问题:
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]
>