在Python中求和?
例如,假设我想对x=1的所有x^2(或任何其他任意函数)求和,直到x^2大于n。这不需要使用一堆while循环和if检查就可以完成吗?难道你不需要做在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
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