嵌套for循环,其中内部循环依赖于外部循环

时间:2019-05-14 18:32:03

标签: python python-3.x standard-library

请考虑以下问题:

  

对所有正整数(x,y)上的函数f:Z ^ 2-> R求和,其中x,y在[0,B]中

这在Python中很容易实现:

res = 0
for x in range(B+1):
    for y in range(B+1):
        res += f(x,y)

当然,可以用多种“更好”的方式编写以上语句。我将重点介绍一种特定的方法---使用itertools,您可以专门编写:

res = 0
for vals in itertools.product(range(B+1), repeat = 2)
    res += f(*vals)

这样做的好处是可以将其泛化为函数f:Z ^ n-> R无关紧要,只需将repeat = 2更改为repeat = n。如果变量的范围不同,则将代码更改为itertools.product(*[B1, B2, ..., Bn]),同样非常容易。


我对执行上述操作很感兴趣,但是我要累加的变量在某种程度上是“相关的”。 考虑一下我要对[0,B] ^ 2中的变量(x,y)求和的情况就足够了,其中x + y <= B。

您可以再次将其写为嵌套的for循环:

res = 0
for x in range(B):
    for y in range(B - x):
        res += f(x, y)

我很感兴趣是否有任何标准的库方法可以将其推广(就像itertools.product推广最后一种构造的方式一样)。您可以再次使用iterator.product构造(并且当{x1,x2,...,xn)不符合标准时仅使用pass,但是我想知道是否有更直接的方法使用标准库对该集合进行迭代。

pass处理方法不合适的原因是因为您必须跳过点数。一些数学计算(将单位l1球的体积与单位l无穷大球的体积作为尺寸的函数关系)表明只有1 / n!点将符合接受标准,因此在[0,B] ^ n上进行迭代并检查某些条件是否为真时,将会有相当大的“浪费”。

0 个答案:

没有答案