使用lambda函数过滤iterables

时间:2013-10-02 14:55:00

标签: python python-3.x lambda itertools

我正在尝试在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])

的工作。无法真正说明发生了什么。

1 个答案:

答案 0 :(得分:5)

itertools.takewhile在找到与该条件不匹配的第一个值时停止。由于第一个数字是1而不能被2整除,所以它会立即停止。

你可以这样写:

 sum(x for x in itertools.takewhile(lambda n: n < 4e6, fnFibonacci()) 
                if x % 2 == 0)