2013-10-02 2 views
0

Я пытаюсь решить Project Euler problem 2 в Python и решил по стратегии на основе итераций.Фильтрация итераций с использованием лямбда-функции

Вот генератор для последовательности Фибоначчи,

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

См [здесь] (http://codereview.stackexchange.com/a/23388/4916) для подобного подхода. – DSM

+0

@DSM Вау, это жутко, как мой подход. Означает ли это, что я хороший программист на Python сейчас? ;) – tchakravarty

+0

«Должен быть один очевидный способ сделать это», как мы говорим, и вы его нашли. Вы изучаете Дзэн. : ^) – DSM

ответ

5

itertools.takewhile останавливается, когда находит первое значение, которое не соответствует критерию. Поскольку первое число равно 1 и не делится на 2, оно останавливается немедленно.

Вы можете написать это:

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

Черт бык! Благодарю. – tchakravarty

Смежные вопросы