在Python中求和?

在Python中求和?,python,Python,例如,假设我想对x=1的所有x^2(或任何其他任意函数)求和,直到x^2大于n。这不需要使用一堆while循环和if检查就可以完成吗?难道你不需要做 max_val = 144 sum(x**2 for x in range(sqrt(max_val))) x是否每次递增1 如果是这样,这将简化为以下公式:x(x+1)(2x+1)/6,因为它是 因此,为了避免循环,您可以直接求解x(x+1)(2x+1)/6>总和(x**2表示itertools.takewhile中的x)(λx:x**2

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

难道你不需要做

max_val = 144   
sum(x**2 for x in range(sqrt(max_val)))

x
是否每次递增1

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


因此,为了避免循环,您可以直接求解
x(x+1)(2x+1)/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))))
如果要使其也适用于递减函数,也可以只传入测试函数:

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
当然

>>> sum(x ** 2 for x in itertools.takewhile(lambda x: x ** 2 <= 100, itertools.count(1)))
385
>>总和(x**2表示itertools.takewhile中的x)(λx:x**2
汇总所有x^2
直到x^2大于n为止


一个
用于
循环,一个
如果
。几乎不是“一堆”

“或任何其他任意函数”我喜欢这一个,因为我只需要写出实际函数一次;takewhile和imap做什么?将从一个iterable(第二个参数)生成元素,直到第一个参数(这是一个函数)对于iterable中的值返回false。为iterable中的每个元素调用一个函数并生成函数调用的结果。我刚刚意识到,与其他答案不同,这个答案不会执行x**2(或任何函数)两次,这使得如何对“任意函数”执行此操作变得非常明显,因此我的答案是不必要的。您可能希望先转换序列,然后过滤它(如F.J的答案),而不是反过来(如本文所示)。对于
x**2
,这几乎不重要,但对于“任何其他任意函数”-这可能是昂贵的,或者更糟糕的是,有副作用,你不想像这样叫它两次。你没有具体说明增量。
>>> sum(x ** 2 for x in itertools.takewhile(lambda x: x ** 2 <= 100, itertools.count(1)))
385
sum = 0
x = 1
while x**2 <= n:
    sum += x**2
    x += 1
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