Rya*_*ott 2 python count infinite python-itertools
我在使用itertools.count函数时遇到了一些麻烦,我不太明白它的作用.我希望下面的代码能够完成Project Euler问题2.
我知道我可以用一个简单的while循环来编写它,但有没有办法用列表理解来做到这一点?这个代码只是冻结,因为我猜它会用count()来无限.我希望它会在x> MAX之后停止,但我知道这不会发生.有没有办法在下面的生成器表达式中停止计数?
def fib(n):
if (n <= 1): return 1
else: return fib(n-1) + fib(n-2)
MAX = 4000000
infiniteFib = (fib(x) for x in count())
s = (x for x in infiniteFib if x < MAX and x % 2 == 0)
print sum(s)
Run Code Online (Sandbox Code Playgroud)
你可以使用takewhile:
>>> from itertools import count, takewhile, imap
>>> sum(x for x in takewhile(lambda x: x < 4000000, imap(fib, count())) if x % 2 == 0)
4613732
Run Code Online (Sandbox Code Playgroud)
我们只需要告诉infiniteFib发电机何时停止产生元素.itertools提供了许多有用的方法来帮助解决这个问题:
less_than_max = itertools.takewhile(lambda x: x<MAX, infiniteFib))
even = itertools.ifilter(lambda x: x%2==0, less_than_max)
print sum(even)
Run Code Online (Sandbox Code Playgroud)
我们为所有产生的数字得到一个发生器infiniteFib,直到返回的数量大于MAX.然后我们过滤那个生成器,只选择偶数.最后我们可以总结结果.