我正在尝试在Python中解决Project Euler problem 2,并决定基于迭代的策略。
这是Fibonacci序列的生成器,
def fnFibonacci():
fibNumPrev, fibNumCurrent = 0, 1
while True:
yield fibNumCurrent
fibNumPrev, fibNumCurrent = fibNumCurrent, fibNumCurrent + fibNumPrev
当我尝试过滤掉小于4百万且可被2整除的斐波那契数字时,它不起作用,将所有内容过滤掉:
sum(list(itertools.takewhile(lambda x: x < 4e6 and x % 2 == 0 , fnFibonacci())))
然而,这两个(忽略了均匀条件):
sum(list(itertools.takewhile(lambda x: x < 4e6, fnFibonacci())))
这个列表理解:
sum([fibNum for fibNum in list(itertools.takewhile(lambda x: x < 4e6, fnFibonacci())) if fibNum % 2 == 0])
的工作。无法真正说明发生了什么。
答案 0 :(得分:5)
itertools.takewhile
在找到与该条件不匹配的第一个值时停止。由于第一个数字是1而不能被2整除,所以它会立即停止。
你可以这样写:
sum(x for x in itertools.takewhile(lambda n: n < 4e6, fnFibonacci())
if x % 2 == 0)