使用lambda函数过滤iterables

tch*_*rty 0 python lambda python-itertools python-3.x

我试图在Python中解决Project Euler问题2,并决定基于iterables的策略.

这是Fibonacci序列的生成器,

def fnFibonacci():
    fibNumPrev, fibNumCurrent = 0, 1
    while True:
        yield fibNumCurrent
        fibNumPrev, fibNumCurrent = fibNumCurrent, fibNumCurrent + fibNumPrev
Run Code Online (Sandbox Code Playgroud)

当我尝试过滤掉小于4百万且可被2整除的斐波那契数字时,它不起作用,将所有内容过滤掉:

sum(list(itertools.takewhile(lambda x: x < 4e6 and x % 2 == 0 , fnFibonacci())))
Run Code Online (Sandbox Code Playgroud)

但是,这两个(忽略了均匀条件):

sum(list(itertools.takewhile(lambda x: x < 4e6, fnFibonacci())))
Run Code Online (Sandbox Code Playgroud)

这个列表理解:

sum([fibNum for fibNum in list(itertools.takewhile(lambda x: x < 4e6, fnFibonacci())) if fibNum % 2 == 0])
Run Code Online (Sandbox Code Playgroud)

工作.真的无法分辨出发生了什么.

Joc*_*zel 5

itertools.takewhile当找到第一个与标准不匹配的值时停止.由于第一个数字是1而不能被2整除,它会立即停止.

你可以这样写:

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