例如,假设我想对 x=1 的所有 x^2(或任何其他任意函数)求和,直到 x^2 大于 n。这可以在不使用一堆 while 循环和 if-checks 的情况下完成吗?
问问题
244 次
5 回答
6
itertools 模块为可扩展的解决方案提供了一些不错的功能:
from itertools import takewhile, count
def sum_func(func, n):
return sum(takewhile(lambda x: x < n, (func(i) for i in count(1))))
例如:
>>> sum_func(lambda x: x**2, 20) # 1^2 + 2^2 + 3^2 + 4^2
30
如果你想让它也适用于递减函数,你也可以传入测试函数:
def sum_func(func, pred):
return sum(takewhile(pred, (func(i) for i in count(1))))
例子:
>>> sum_func(lambda x: -x*2, lambda x: x > -10) # -1*2 + -2*2 + -3*2 + -4*2
-20
于 2012-12-12T17:41:23.317 回答
3
绝对地。
>>> sum(x ** 2 for x in itertools.takewhile(lambda x: x ** 2 <= 100, itertools.count(1)))
385
于 2012-12-12T17:41:23.587 回答
1
你不只是需要做...
max_val = 144
sum(x**2 for x in range(sqrt(max_val)))
于 2012-12-12T17:40:19.580 回答
0
于 2012-12-12T17:41:13.483 回答
0
对所有 x^2 求和,
直到 x^2 大于 n
sum = 0
x = 1
while x**2 <= n:
sum += x**2
x += 1
一个while
循环,没有if
s。
如果您更愿意使用for
循环:
import itertools
sum = 0
for x in itertools.count(1): # Generates an infinite series: 1, 2, 3, ...
square = x**2
if square > n:
break
sum += square
一圈for
,一圈if
。几乎没有“一堆”。
于 2012-12-12T17:43:06.703 回答