2

例如,假设我想对 x=1 的所有 x^2(或任何其他任意函数)求和,直到 x^2 大于 n。这可以在不使用一堆 while 循环和 if-checks 的情况下完成吗?

4

5 回答 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

x每次加1 ?

如果是这样,这将简化为以下公式:x(x+1)(2x+1)/6,因为它是整数的平方和

所以你真的想避免循环,你可以x(x+1)(2x+1)/6 < n直接解决

于 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循环,没有ifs。

如果您更愿意使用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 回答