如何继续外侧的 for 循环?

How can I continue the for loop of the outer side?

def countPrimes(self, n):
        if n <= 1:
            return 0
        if n == 2:
            return 1
        count = 0
        counted = [2, ]
        for num in xrange(3, n+1, 2):
            for c in counted:
                if num % c == 0:
                    continue
            count += 1
            counted.append(num)
        return count

我正在编写解决素数计数问题的代码。我将计数用作存储已检查素数的数组,并将它们用于下一个素数的检查。我尝试使用 continue 退出内部 for 循环,然后一旦发现 num 不是有效素数, count += 1 and counted.append(num) 将不会执行。但是,我在这里遇到了实施问题,因为 continue 语句会将我带到另一个 c 而不是另一个 num.

尝试使用 break 而不是 continue。参见documentation here。基本上 break 带你离开最小的封闭循环,让你回到更高级别的循环中进行下一次迭代。另一方面,continue 只是让您跳转到最小闭合循环的下一次迭代,所以您不会先进入更高级别的循环。

如果我对你的问题理解正确,你想知道如何打破内部 c 循环,避免其他代码,并继续另一个 num。与其他答案一样,您想将 break 与一些智能布尔值一起使用。循环可能如下所示:

for num in xrange(3, n+1, 2):
    next_num = False
    for c in counted:
        if num % c == 0:
            next_num = True
            break
    if next_num:
        continue
    count += 1
    counted.append(num)

这样,如果遇到能被c整除的num,就跳出内部c循环,避免将num加入到计数列表中。

边走边累加计数和素数列表没有多大意义。在某处引入不匹配的机会。我对代码做了一些修改,使用了一些更具描述性的变量名称。令人惊奇的是,清晰的名称真的可以使算法更有意义。 (至少对我来说是这样)

def primesUpTo(n):
    primes = []
    if n > 1:
        primes.append(2)
    for candidate in xrange(3, n+1, 2):
        for prime in primes:
            candidate_is_prime = candidate % prime
            if not candidate_is_prime: # We're done with this inner loop
                break
        if candidate_is_prime:
            primes.append(candidate)
    return primes

print len(primesUpTo(100))